POJ Flip Game

来源:互联网 发布:java 格式化数字 编辑:程序博客网 时间:2024/05/17 04:39
//枚举题//由于总共有2的16次方个动作,动作的意思就是如果该数的某位为1的话,就进行抑或操作//改变每一位对应的操作是与相应的数字进行抑或,我们用oper数组定义#include<iostream>using namespace std;int mat[4][4];int oper[16]={0xC800,0xE400,0x7200,0x3100,0x8C80,0x4E40,0x2720,0x1310,0x08C8,0x04E4,0x0272,0x0131,0x008C,0x004E,0x0027,0x0013};int comp[16];int res,ans;void putin(int a){int num=15;while(a){comp[num]=a%2;a=a/2;num--;}}int numof(){int sum=0;for(int i=0;i<16;i++){if(comp[i]==1)sum++;}return sum;}int main(){char ch;res=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){scanf("%c",&ch);if(ch=='b'){mat[i][j]=1;res+=1<<(15-(4*i+j));//一开始错误的原因是把1写成2了,1左移等于2的多少次方,要记清楚。}else{mat[i][j]=0;}}getchar();}int tmp,max;ans=16;bool flag=false;for(int i=0;i<65536;i++){tmp=res;memset(comp,0,sizeof(comp));putin(i);for(int j=0;j<16;j++){if(comp[j]==1){tmp=tmp^oper[j];}}if(tmp==0||tmp==65535){flag=true;max=numof();if(ans>max)ans=max;}}if(flag)printf("%d\n",ans);elseprintf("Impossible\n");return 0;}


原创粉丝点击