看题传送门:http://poj.org/problem?id=1753
DFS枚举的应用。
基本上是参考大神的。。。。
学习学习。。
#include<cstdio>
#include<iostream>
using namespace std;
int n,s,d,ans;
bool a[5][5],flag=false;
//判断全部一样的情况
bool alllike()
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(a[i][j]!=a[0][0])
return false;
return true;
}
//翻转棋
void flip(int r,int c)
{
if(r>0)
a[r-1][c]=!a[r-1][c];
if(c>0)
a[r][c-1]=! a[r][c-1];
if(r<3)
a[r+1][c]=!a[r+1][c];
if(c<3)
a[r][c+1]=!a[r][c+1];
a[r][c]=!a[r][c];
}
void dfs(int r,int c,int deep)
{
if(deep==ans)
{
flag=alllike();
return;
}
if(r==4||flag)
return;
flip(r,c); //翻转棋
if(c<3)
dfs(r,c+1,deep+1);
else
dfs(r+1,0,deep+1);
flip(r,c); //把棋翻回来
if(c<3) //如果不满足则不翻转该棋
dfs(r,c+1,deep);
else
dfs(r+1,0,deep);
return;
}
int main()
{
char c;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
scanf("%c",&c);
if(j==3)
getchar();
// cin>>c; //直接用cin也可以
if(c=='b')
a[i][j]=true;
else
a[i][j]=false;
}
for(ans=0;ans<=16;ans++)
{
dfs(0,0,0);
if(flag)
break;
}
if(flag)
printf("%d\n",ans);
else
printf("Impossible\n");
}

362

被折叠的 条评论
为什么被折叠?



