POJ 1753 Flip Game DFS枚举

时间:2022-04-23 07:40:51

看题传送门: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"); }