第一道poj题,简单枚举+dfs,poj没有题解根本刚不过,代码和题解高度相似。这道题难点在于对递归的理解。step记录步数,棋盘模型决定了step上限是16,暴力枚举出每次到达相应步数的所有情况,进行判断,flag为真时找到步数,输出,结束。//测试无法找到答案时递归次数为2^16次。
1753 Accepted 164K 235MS C++ 1202B
#include<cstdio>
using namespace std;
bool Map[5][5],flag;
int step;
int cnt;
void turn(int i,int j)
{
Map[i][j]=!Map[i][j];
if(i>0)
Map[i-1][j]=!Map[i-1][j];
if(i<3)
Map[i+1][j]=!Map[i+1][j];
if(j>0)
Map[i][j-1]=!Map[i][j-1];
if(j<3)
Map[i][j+1]=!Map[i][j+1];
}
bool ju ()
{
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if(Map[i][j]!=Map[0][0])
return false;
return true;
}
void dfs(int i,int j,int p)
{
if(p==step)
{
flag=ju();
return;
}
if(i==4||flag)
return;
turn(i,j);
if(j<3)
dfs(i,j+1,p+1);
else
dfs(i+1,0,p+1);
turn(i,j);
if(j<3)
dfs(i,j+1,p);
else
dfs(i+1,0,p);
}
int main()
{
char t;
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
scanf("%c",&t);
if(t=='b')
Map[i][j]=true;
else
Map[i][j]=false;
}
getchar();
}
flag=false;
for(step=0; step<=16; step++)
{
dfs(0,0,0);
if(flag)break;
}
if(flag)printf("%d",step);
else printf("Impossible");
}