来源:点击打开链接
网络赛已被虐瞎……做点经典题找自信。
最多有2^16种状态,DFS/BFS都可以,参考了小優YoU的博客:
#include <iostream>
#include <cstring>
using namespace std;
bool mat[6][6];
int step;
bool flag;
int dirc[5]={0,0,1,-1,0};
int dirr[5]={1,-1,0,0,0};
bool isfinal()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(mat[i][j]!=mat[1][1])
return false;
}
}
return true;
}
void flip(int row,int col)
{
for(int i=0;i<=4;i++)
{
mat[row+dirr[i]][col+dirc[i]]=!mat[row+dirr[i]][col+dirc[i]];
}
return;
}
void dfs(int row,int col,int deep)
{
if(deep==step)
{
flag=isfinal();
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()
{
memset(mat,0,sizeof(mat));
char tmp;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>tmp;
if(tmp=='b')
mat[i][j]=1;
}
}
for(step=0;step<=16;step++)
{
dfs(1,1,0);
if(flag)
break;
}
if(flag)
cout<<step<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}