poj 2965.The Pilots Brothers' refrigerator

来源:互联网 发布:网络营销策划gzfq 编辑:程序博客网 时间:2024/06/18 16:17

The Pilots Brothers' refrigerator

#include<iostream>using namespace std;bool board[16];int is[16];int js[16];bool check(){for(int i=0;i<16;i++){if(board[i]!=1)return false;}return true;}void init(){char a;for(int i=0;i<16;i++){cin>>a;if(a=='+'){board[i]=0;}else{board[i]=1;}}}void flip(int pos){int i=pos/4;int j=pos%4;board[pos]=!board[pos];for(int m=0;m<4;m++){board[i*4+m]=!board[i*4+m];board[(m)*4+j]=!board[(m)*4+j];}}bool dfs(int pos,int step){if(check()){cout<<step<<endl;for(int i=0;i<step;i++){cout<<is[i]<<" "<<js[i]<<endl;}return true;}if(pos>=16){return false;}//1. dont change this posif(dfs(pos+1,step))return true;//2. change this posflip(pos);is[step]=pos/4+1;js[step]=pos%4+1;if(dfs(pos+1,step+1))return true;flip(pos);return false;}int main(){init();dfs(0,0);}
#include<stdio.h>#include<string.h>int chess;int a[16],b[16];void init(){char ch;chess=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){chess=(chess<<1)+((ch=getchar())=='-'?1:0);}getchar();}}bool isopen(){if(chess==0xffff)return true;return false;}void flip(int pos){chess^=(0x1<<pos);int row=pos/4;int col=pos%4;for(int i=0;i<4;i++){chess^=(0x1<<(4*row+i));chess^=(0x1<<(4*i+col));}return ;}bool dfs(int pos,int steps){if(isopen()){printf("%d\n",steps);for(int i=0;i<steps;i++)printf("%d %d\n",a[i],b[i]);return true;}if(pos>=16)return false;//1. dont change this pos   if(dfs(pos+1,steps))return true;//2. change this pos   flip(pos);a[steps]=pos/4+1;      b[steps]=pos%4+1;  if(dfs(pos+1,steps+1))return true;flip(pos);return false;}int main(){init();dfs(0,0);return 0;}
// 先看一个简单的问题,如何把'+'变成'-'而不改变其他位置上的状态?// 答案是将该位置(i,j)及位置所在的行(i)和列(j)上所有的handle更新一次。// 结果该位置被更新了7次,相应行(i)和列(j)的handle被更新了4次,剩下的被更新了2次.// 被更新偶数次的handle不会造成最终状态的改变.// 因此得出高效解法,在每次输入碰到'+'的时候, 计算所在行和列的需要改变的次数// 当输入结束后,遍历数组,所有为奇数的位置则是操作的位置,而奇数位置的个数之和则是最终的操作次数.// PS:该题不会有"Impossible"的情况.#include<iostream>using namespace std;bool mark[4][4];char s[4][4];int is[16];int js[16];int main(){memset(mark,0,sizeof(mark));for(int i=0;i<4;i++)cin>>s[i];for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(s[i][j]=='+'){mark[i][j]=!mark[i][j];for(int k=0;k<4;k++){mark[i][k]=!mark[i][k];mark[k][j]=!mark[k][j];}}}}int count=0;for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(mark[i][j]){is[count]=i+1;js[count]=j+1;count++;}}}cout<<count<<endl;for(int i=0;i<count;i++){cout<<is[i]<<" "<<js[i]<<endl;}return 0;};