Flip Game(poj1753_阵列的枚举)

来源:互联网 发布:java垃圾回收机制 编辑:程序博客网 时间:2024/06/09 17:36

题目:http://poj.org/problem?id=1753

 

思路1:0MS

1)递归枚举第一行,16种情况;

2)  然后分别通过下一行的翻转来使上一行全‘b’或全'w';

3)一旦第一行16种情况的其中一种形成,则下面的翻转情况就唯一确定了,所以枚举量为16;

4)最后检查最后一行是否全‘b’或全‘w’来判断满不满足全‘b’或全‘w’。

思路2:

还可使用高斯消元法做

 

#include <cstdio>#include <cstring>#define INF 20int cnt1;char anti(char c){if(c=='b') c='w';else c='b';return c;}void digui(char arr[][5],int cnt,int cur){if(cur==4){char arr1[5][5];int i,j,cnt2,flag;for(i=0;i<4;i++)strcpy(arr1[i],arr[i]);cnt2=cnt;for(i=1;i<4;i++){for(j=0;j<4;j++){if(arr[i-1][j]=='b'){arr[i-1][j]=anti(arr[i-1][j]);arr[i][j]=anti(arr[i][j]);if(j-1>=0)arr[i][j-1]=anti(arr[i][j-1]);if(j+1<4)    arr[i][j+1]=anti(arr[i][j+1]);if(i+1<4)        arr[i+1][j]=anti(arr[i+1][j]);cnt2++;}}}flag=0;for(i=0;i<4;i++){if(arr[3][i]!='w')    flag=1; }if(flag==0){if(cnt2<cnt1)        cnt1=cnt2;}for(i=0;i<4;i++)    strcpy(arr[i],arr1[i]);cnt2=cnt;for(i=1;i<4;i++){for(j=0;j<4;j++){if(arr[i-1][j]=='w'){arr[i-1][j]=anti(arr[i-1][j]);arr[i][j]=anti(arr[i][j]);if(j-1>=0)arr[i][j-1]=anti(arr[i][j-1]);if(j+1<4)    arr[i][j+1]=anti(arr[i][j+1]);if(i+1<4)        arr[i+1][j]=anti(arr[i+1][j]);cnt2++;}}}flag=0;for(i=0;i<4;i++){if(arr[3][i]!='b')    flag=1; }if(flag==0){if(cnt2<cnt1)        cnt1=cnt2;}for(i=0;i<4;i++)    strcpy(arr[i],arr1[i]);            return;}else{for(int k=0;k<2;k++){if(k==1){arr[0][cur]=anti(arr[0][cur]);if(cur-1>=0)arr[0][cur-1]=anti(arr[0][cur-1]);if(cur+1<4)    arr[0][cur+1]=anti(arr[0][cur+1]);arr[1][cur]=anti(arr[1][cur]);digui(arr,cnt+1,cur+1);arr[0][cur]=anti(arr[0][cur]);if(cur-1>=0)arr[0][cur-1]=anti(arr[0][cur-1]);if(cur+1<4)    arr[0][cur+1]=anti(arr[0][cur+1]);arr[1][cur]=anti(arr[1][cur]);} else{digui(arr,cnt,cur+1);}}return;}}int main(){//freopen("input.txt","r",stdin);char arr[5][5];    for(int i=0;i<4;i++)    {        gets(arr[i]);    }        int sum=0;for(int i=0;i<4;i++)for(int j=0;j<4;j++)    if(arr[i][j]=='w')sum+=1;    if(sum==0 || sum==16) {printf("%d\n",0);return 0;}    cnt1=INF;digui(arr,0,0);if(cnt1==INF)    printf("Impossible\n");elseprintf("%d\n",cnt1);return 0;}


 

        

 

原创粉丝点击