这道题,对我来说,真他妈的不容易!
代码如下:
#include<iostream>
using namespace std;
bool map[6][6],find=false;
int step;
int dr[5]={-1,0,0,0,1};
int dc[5]={0,-1,0,1,0};
bool isgoal() //判断所有的格子是否一样
{
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(map[i][j]!=map[1][1])
return false;
return true;
}
void flip(int row,int col) //翻转格子的变化
{
for(int i=0;i<5;i++)
{
int r=row+dr[i];
int c=col+dc[i];
map[r][c]=!map[r][c];
}
}
void dfs(int row,int col,int dep) //判断是否要翻转
{
if(dep==step)
{
find=isgoal();
return;
}
if(find||row==5)return;
flip(row,col); //对格子进行翻转
if(col<4) dfs(row,col+1,dep+1);
else dfs(row+1,col,dep+1);
flip(row,col);
if(col<4) dfs(row,col+1,dep); //对格子进行还原(要注意这里dep和dep+1的区别)
else dfs(row+1,1,dep);
}
int main()
{
char c;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
cin>>c;
if(c=='b') map[i][j]=true;
}
for(step=0;step<=16;step++)
{
dfs(1,1,0);
if(find) break;
}
if(find) cout<<step<<endl;
else cout<<"Impossible"<<endl;
return 0;
}