[POJ1681]画家问题
来源:互联网 发布:流星网络电视tv版apk 编辑:程序博客网 时间:2024/05/01 06:00
描述
有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。
输入
第一行是个整数t(1≤t ≤20),表示要测试的案例数。然后是t个案例。每个案例的首行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白砖,“y”表示黄砖。
输出
每个案例输出一行。如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。
思路:每个点最多只可能涂1次,因为涂2次和没涂一样。第一行通过枚举随机涂几个点,第二行开始判断他上边的点是否为黄色,不是则涂他自己,一直到最后一行。全部涂完后判断最后一行的点是否均为黄色,是的话则有解,不是则无解。代码如下:
#include <iostream>#include <cstdio>#include <cmath> int map[20][20];int copy[20][20];int line[20];char col[20];int n;int min;int count; void draw(int x, int y){ //绘制并增加绘制次数 map[x][y] = !map[x][y]; map[x-1][y] = !map[x-1][y]; map[x+1][y] = !map[x+1][y]; map[x][y-1] = !map[x][y-1]; map[x][y+1] = !map[x][y+1]; count++;} bool guess(){ //从第二行开始 判断每个点上边的点是否为黄色 如果不是黄色 则涂该点 for(int i=2; i<=n; i++) for(int j=1; j<=n; j++) if(map[i-1][j] == 0) draw(i,j); //判断最后一行是否都为黄色 如果是则记录次数 否则提交失败 for(int k=1; k<=n; k++) if(map[n][k] != 1) return false; if(count < min) min = count; return true;} void getLine(int k){ //通过二进制枚举第一行可能发生的所有情况 int j = n; while(j>0){ line[j] = k % 2; k /= 2; j--; }} int main(){ int w; scanf("%d\n", &w); while(w--){ scanf("%d\n", &n); min = n * n + 1; for(int i=1; i<=n; i++){ scanf("%s", col); for(int j=1; j<=n; j++) if(col[j-1] == 'w') copy[i][j] = 0; else copy[i][j] = 1; } for(int k=0; k<pow(2.0, n); k++){ count = 0; memcpy(map, copy, sizeof(copy)); getLine(k); for(int i=1; i<=n; i++) if(line[i] == 1) draw(1,i); guess(); } if(min != n * n + 1) printf("%d\n",min); else printf("inf\n"); } return 0;}
1 0
- [POJ1681]画家问题
- 枚举—案例(画家问题poj1681)
- POJ1681画家问题(枚举)采用位运算
- 画家问题
- 画家问题
- 画家问题
- 画家问题
- 画家问题
- 画家问题
- poj1681
- poj1681--Painter's Problem(高斯消元问题4)
- 画家问题 pku1681
- poj 1681 画家问题
- POJ画家问题
- 枚举 画家问题
- POJ 1681 画家问题
- 画家问题--枚举方法
- 画家问题(关灯问题)
- 深度学习鼻祖杰夫·辛顿及巨头们的人才抢夺战
- 一句话搞定webmap(一)——轻地图组件
- ajax的post
- OO多态性的一个体现
- Server.CreateObject("Excel.Application")的权限问题
- [POJ1681]画家问题
- WebDriver: Advanced Usage
- IOS 截屏||截图
- mongodb的group详细成功案例
- pig基础知识总结
- 为何OpenWrt能在这十年里脱颖而出?(转自雷锋网)
- C++的函数重载
- Java学习之Iterator(迭代器)的一般用法
- html Frame