poj.1753dfs

来源:互联网 发布:nba乔丹职业生涯数据 编辑:程序博客网 时间:2024/05/21 07:51

这道题的意思很简单,主要需要注意的有两点,第一:矩阵中的每个点都最多被主动翻一次,(注意不是被动),所以总共有2^16种可能,只要枚举每种可能了。第二:翻转的顺序对结果没有影响,所以问题的关键就在于那些点被主动翻转了。翻转多少次就有多少次round,只要求出所有round中最小的一个就是答案了,如果没有一种可能可以得到结果则输出“Impossible"。下面是代码和测试数据:

//#include <iostream>#include <stdio.h>#include <stdlib.h>//using namespace std;#define Inf 1000000int maxn;int s[4][4];void Init(){char ch[4][4];int i,j;for(i=0;i<4;i++)scanf("%s",ch[i]);for(i=0;i<4;i++)for(j=0;j<4;j++){if(ch[i][j]=='b')s[i][j]=1;elses[i][j]=-1;}/*for(i=0;i<4;i++)for(j=0;j<4;j++)             printf("%d ",s[i][j]);*/}bool Is_right(int (*t)[4]){int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)if(t[i][j]!=t[0][0])return false;return true;}void dfs(int (*t)[4],int x,int y,int deep){if(Is_right(t)){if(deep<maxn)maxn=deep;return ;}if(x>=4)return ;//int (*record)[4]=t;int record[4][4],i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)record[i][j]=t[i][j];if(x>=0 && x<=3 && y>=0 && y<=3)record[x][y]=-record[x][y];if(x-1>=0 && x-1<=3 && y>=0 && y<=3)record[x-1][y]=-record[x-1][y];if(x+1>=0 && x+1<=3 && y>=0 && y<=3)record[x+1][y]=-record[x+1][y];if(x>=0 && x<=3 && y-1>=0 && y-1<=3)record[x][y-1]=-record[x][y-1];if(x>=0 && x<=3 && y+1>=0 && y+1<=3)record[x][y+1]=-record[x][y+1];if(y<=2){dfs(t,x,y+1,deep);dfs(record,x,y+1,deep+1);}else{dfs(t,x+1,0,deep);dfs(record,x+1,0,deep+1);}}int main(){//int i,j;while(true){     Init();    if(Is_right(s)){printf("0\n");continue;//return 0;}maxn=Inf;dfs(s,0,0,0);if(maxn==Inf){printf("Impossible\n");continue;//return 0;}printf("%d\n",maxn);}return 0;}


bwbw
wwww
bbwb
bwwb


bwwb
bbwb
bwwb
bwww


wwww
wwww
wwww
wwww


bbbb
bbbb
bbbb
bbbb


bbbb
bwbb
bbbb
bbbb


bwbb
bwbb
bwbb
bbbb


bwbb
wwwb
bwbb
bbbb


wwww
wwwb
wwbb
wwwb


wwww
wwww
wwwb
wwbb


wbwb
bwbw
wbwb
bwbw


bbbb
bwwb
bwwb
bbbb


bwwb
wbbw
wbbw
bwwb


bbww
bbww
wwbb
wwbb


bbwb
bbbw
wwbb
wwwb


wwwb
wwbw
wbww
wwbw


bbbb
wwww
wwbb
wbbb

bwwb
wbwb
wbbb
wbbb


bwbb
bwbb
bwbw
bbbw


wbwb
bbbb
bbww
wbbb


bbwb
bbbb
wbwb
bbbb


 

 

原创粉丝点击