题目大意:
有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使4*4的正方形变为纯白或者纯黑?
代码如下:
/* * 1753_1.cpp * * Created on: 2013年9月13日 * Author: Administrator */ #include <iostream> #include <cstdio> using namespace std; /** * chess[][] :棋子的翻转情况 * flag : 判断是否是清一色 * step :已经进行的步数 * r[] :方向向量, 行移动的方向 * c[] :方向向量, 列移动的方向 */ bool chess[6][6] = {false};//不要写成5,因为这里没对特定边界值进行处理。利用的只有中心的4x4 bool flag; int step; int r[5] = {1,-1,0,0,0}; int c[5] = {0,0,1,-1,0}; /** * 判断所有棋子是否同色 */ bool judge_all(){ int i,j; for(i = 1 ; i < 5 ; ++i){ for(j = 1 ; j < 5 ; ++j){ if(chess[i][j] != chess[1][1]){ return false; } } } return true; } /** * 翻转其中的一枚棋子,机器周围的棋子 */ void flip(int row,int col){ int i; for(i = 0 ; i < 5 ; ++i){ chess[row + r[i]][col + c[i]] = !chess[row + r[i]][col + c[i]]; } } void dfs(int row,int col , int deep){ if(deep == step){ flag = judge_all(); return ; } if(flag || row == 5){ return ; } flip(row,col);//翻棋 if(col < 4){ dfs(row,col+1,deep+1); }else{ dfs(row+1,1,deep+1); } flip(row,col);//不符合则翻回来 if(col < 4){ dfs(row,col+1,deep); }else{ dfs(row+1,1,deep); } return ; } int main(){ int i,j; char temp; flag = false; step = 0; for(i = 1 ; i < 5 ; ++i){ for(j = 1 ; j < 5 ; ++j){ cin >> temp; if(temp == 'b'){ chess[i][j] = true; } } } /** * 对每一步产生的可能性进行枚举 * 至于为什么是16,考虑到4x4=16格,而每一格只有黑白两种情况,则全部的可能性为2^16 */ for(step = 0 ; step <=16 ; ++step){ dfs(1,1,0); if(flag){ break; } } if(flag){ cout<<step<<endl; }else{ printf("Impossible\n"); } return 0; }