poj2965

来源:互联网 发布:软件项目保密协议 编辑:程序博客网 时间:2024/06/08 10:09
这题和1753差不多,多了一个数位压缩状态,记录翻了的点
#include<iostream>  #include <string>   #include<vector>  #include<algorithm>  #include<set>  #include<cmath>  using namespace std;  #define lch(i) ((i)<<1)  #define rch(i) ((i)<<1|1)  #define sqr(i) ((i)*(i))  #define pii pair<int,int>  #define mp make_pair  #define FOR(i,b,e) for(int i=b;i<=e;i++)  #define ms(a)   memset(a,0,sizeof(a))  const int maxnum = 10005;      int mat[4][4];  bool vis[4][4];      void flip(int x,int y){      mat[x][y]=1-mat[x][y];      FOR(i,0,3) mat[i][y]=1-mat[i][y];FOR(i,0,3) mat[x][i]=1-mat[x][i];    /*printf("\n");     FOR(i,0,3){         FOR(j,0,3){             printf("%d",mat[i][j]);         }         printf("\n");     }*/    }    bool check(){      int sum=0;      FOR(i,0,3){          FOR(j,0,3){              sum+=mat[i][j];          }      }      if (sum==16)      {          return true;      }      return false;  }      int mintime=100, mindp=0;void enumM(int n,int times ,int dp){      if(n==16)return;      enumM(n+1,times,dp);          flip(n/4,n%4);      if(check()){          mintime=min(mintime,times);  mindp = dp|(1<<n);    }      enumM(n+1,times+1,dp|(1<<n));      flip(n/4,n%4);  }    int main()  {      char ch;      FOR(i,0,3){          FOR(j,0,3){              scanf("%c",&ch);              if(ch=='+')mat[i][j]=0;              else        mat[i][j]=1;          }scanf("%c",&ch);      }      ms(vis);      if(check()) printf("0\n");      else{          enumM(0,1,0);          if(mintime>16)printf("Impossible\n");          else printf("%d\n",mintime);  int tmp,val;while(mindp){val=0;tmp = mindp & (-mindp);mindp -=tmp;while(tmp){val++;tmp =tmp>>1;};val--;printf("%d %d\n",val/4+1,val%4+1);}    }  }

0 0