1. 程式人生 > >poj 1753

poj 1753

namespace set || map for == getc 簡單 +=

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

poj 1753