poj 1753

poj 1753
做搜索题还是要找到特殊性质和枚举方式
哪怕很简单的性质,也会产生很大的影响
在这个题中,同一个格子翻2次和不翻没有区别,在这里有一个小细节就是可以有impossible的情况,这也意味着所有情况都可以在规定时间内枚举到,这也就是你枚举所有情况就可以了。
这题还有一个巧妙的方法
如果第一行是确定的,那么从第二行开始把上一行变成全黑或全白的情况是唯一的。找到联系后,所有情况也就2*16种了。
剩下的就是技巧了,比如状压,位运算,进制等等。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<map>
  9 #include<stack>
 10 #include<cstring>
 11 #define inf 2147483647
 12 #define ls rt<<1
 13 #define rs rt<<1|1
 14 #define lson ls,nl,mid,l,r
 15 #define rson rs,mid+1,nr,l,r
 16 #define N 100010
 17 #define For(i,a,b) for(int i=a;i<=b;i++)
 18 #define p(a) putchar(a)
 19 #define g() getchar()
 20 
 21 using namespace std;
 22 int dx[]={0,1,-1,0,0};
 23 int dy[]={0,0,0,1,-1};
 24 char c[10];
 25 int st;
 26 int ans=inf;
 27 //black为1,white为0
 28 void in(int &x){
 29     int y=1;
 30     char c=g();x=0;
 31     while(c<'0'||c>'9'){
 32         if(c=='-')y=-1;
 33         c=g();
 34     }
 35     while(c<='9'&&c>='0'){
 36         x=(x<<1)+(x<<3)+c-'0';c=g();
 37     }
 38     x*=y;
 39 }
 40 void o(int x){
 41     if(x<0){
 42         p('-');
 43         x=-x;
 44     }
 45     if(x>9)o(x/10);
 46     p(x%10+'0');
 47 }
 48 
 49 int file(int xx,int yy,int temp){
 50     For(i,0,4){
 51         int x=xx+dx[i],y=yy+dy[i];
 52         if(x>=0&&x<4&&y>=0&&y<4)
 53         temp^=1<<(15-4*x-y);
 54     }
 55     return temp;
 56 } 
 57 
 58 void dfs(int cur,int num,int state,int flag){
 59     if(cur==4&&(state==0xffff||state==0)){
 60         ans=min(ans,num);
 61     }
 62     if(cur==4)return;
 63     int i=cur-1;
 64     For(j,0,3){
 65         if(((state&(1<<(15-4*i-j)))>>(15-4*i-j))^flag){
 66             state=file(cur,j,state);
 67             num++;
 68         }
 69     }
 70     dfs(cur+1,num,state,flag);
 71 }
 72 
 73 void en(int st){
 74     For(i,0,15){
 75         int num=0,state=st;
 76         For(j,0,3)
 77             if(i&(1<<j)){
 78                 num++;
 79                 state=file(0,j,state);
 80             }
 81         dfs(1,num,state,0);
 82         dfs(1,num,state,1);
 83     }
 84 }
 85 
 86 int main(){
 87     For(i,0,3){
 88         cin>>c;
 89         For(i,0,3){
 90             st<<=1;
 91             st+=(c[i]=='b'?1:0);
 92         }
 93     }
 94     en(st);
 95     if(ans==inf)
 96         cout<<"Impossible";
 97     else
 98         cout<<ans;
 99     return 0;
100 }
View Code
原文地址:https://www.cnblogs.com/war1111/p/10310824.html