POJ 1753 Flip Game DFS枚举
看题传送门: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"); }
新 blog : www.hrwhisper.me