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 }