标签:tom otto word ons red mis top aced line
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 47766 | Accepted: 20383 |
Description
Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
题意:把一个4*4的棋盘翻转为颜色统一,翻转规则是翻转一个棋子时,这个棋子上下左右也要进行翻转。
思路:枚举。递归真是横贯搜索啊 ~~用好了真心感觉神奇,今天又重新写了一下之前写的这道题,发现又有了新的大陆。
#include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f int flag,min,map[4][4]; int CheckMap(int map[][4]) { for(int i = 0; i < 4; i ++) for(int j = 0; j < 4; j ++) if(map[i][j] != map[0][0]) return 0; return 1; } void Reverse(int ans) { int k[4][2] = {0,1,0,-1,-1,0,1,0}; int x = ans/4; int y = ans%4; map[x][y] ^= 1; for(int i = 0; i< 4; i ++) { x = ans/4 + k[i][0]; y = ans%4 + k[i][1]; if(x < 0||y < 0||x > 3||y > 3) continue; map[x][y] ^= 1; } return; } void dfs(int ans,int step) { if(CheckMap(map)) { flag = 1; if(step < min) min = step; return; } if(ans == 16) return; dfs(ans+1,step);//不翻转当前棋子 Reverse(ans);//翻转当前棋子 dfs(ans+1,step+1);//翻转当前棋子步数+1,往下搜索 Reverse(ans); //复原 } int main() { char str[4][4]; flag = 0; min = inf; for(int i = 0; i < 4; i ++) { for(int j = 0; j < 4; j ++) { scanf("%c",&str[i][j]); if(str[i][j] == ‘b‘) map[i][j] = 1; else map[i][j] = 0; } getchar(); } dfs(0,0); if(!flag) printf("Impossible\n"); else printf("%d\n",min); return 0; }
标签:tom otto word ons red mis top aced line
原文地址:http://www.cnblogs.com/chengdongni/p/7784350.html