题目链接:
http://poj.org/problem?id=1753
题目大意就是一张4*4的棋盘上摆满棋子(棋子可翻面,一面黑色一面白色),每次翻一个棋子,就要把该棋子上下左右的所有棋子都翻面,问最少几次就能把棋盘翻成全黑或者全白!
棋盘才4*4,搜索加枚举就能解决!
#include<iostream>
#include<cstring>
using namespace std;
int map[4][4];
int temp[4][4];
void init()
{
char ch;
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
map[i][j]=((ch=getchar())=='b'?1:0);
}
getchar();
}
}
void flip(int i,int j)
{
temp[i][j]=1-temp[i][j] ;
if (i-1>=0)
temp[i-1][j]=1-temp[i-1][j] ;
if (j-1>=0)
temp[i][j-1]=1-temp[i][j-1] ;
if (i+1<=3)
temp[i+1][j]=1-temp[i+1][j] ;
if (j+1<=3)
temp[i][j+1]=1-temp[i][j+1] ;
}
bool judge()
{
int flag=0;
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
flag+=temp[i][j];
}
}
if(flag==16||flag==0)
return true;
else
return false;
}
int solve(int k, int l, int n)
{
int i,j;
if(judge()) return 1 ;
if(n<=0) return 0 ;
for(i=k;i<4;i++)
{
if(i==k)
j=l;
else
j=0 ;
for (;j<4;j++)
{
flip(i,j) ;
if (j==3)
{
if(solve(i+1,0,n-1))
return 1 ;
}
else
{
if(solve(i,j+1,n-1))
return 1 ;
}
flip(i,j) ;
}
}
return 0 ;
}
int main()
{
init();
int round,i,j;
for(round=0;round<=16;round++)
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
temp[i][j]=map[i][j];
}
if(solve(0,0,round))
{
printf("%d\n",round);
return 0;
}
}
printf("Impossible\n");
return 0;
}