題目來源
http://poj.org/problem?id=1753
#include<stdio.h>
int map[10][10],ans=999999;
char s[10];
int panduan() //判斷是否都爲同一色
{
int m=map[0][0];
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if(map[i][j]!=m)return 0;
return 1;
}
void fan(int x,int y) //將這一點和四個方向的棋子翻轉
{
map[x][y]=!map[x][y];
if(x-1>=0)
map[x-1][y]=!map[x-1][y];
if(x+1<4)
map[x+1][y]=!map[x+1][y];
if(y-1>=0)
map[x][y-1]=!map[x][y-1];
if(y+1<4)
map[x][y+1]=!map[x][y+1];
}
void dfs(int x,int y,int t)
{
if(panduan()) //每次搜索先判斷是否爲同一色,然後更新最小值
{
if(ans>t)
ans=t;
return ;
}
if(x>=4||y>=4||x<0||y<0)return ;
int nx,ny;
nx=(x+1)%4;
ny=y+(x+1)/4;
dfs(nx,ny,t);
fan(x,y);
dfs(nx,ny,t+1);
fan(x,y);
return ;
}
int main()
{
int i,j;
for(i=0; i<4; i++)
{
scanf("%s",s);
for(j=0; j<4; j++)
{
if(s[j]=='b') //將黑色初始爲0
map[i][j]=0;
else //白色初始1
map[i][j]=1;
}
}
dfs(0,0,0);
if(ans==999999)printf("Impossible\n");
else
printf("%d\n",ans);
return 0;
}