The Pilots Brothers' refrigerator
http://poj.org/problem?id=2965
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define maxn 100000 5 using namespace std; 6 struct node 7 { 8 int r,c,pre,ans,mm; 9 }p[maxn],st,st1; 10 int id; 11 int flag; 12 bool visi[maxn]; 13 char ss[maxn]; 14 void bfs(int m) 15 { 16 int be=0,ed=0; 17 p[ed].c=p[ed].r=p[ed].pre=-1; 18 p[ed].ans=0; 19 p[ed++].mm=m; 20 visi[m]=true; 21 while(be!=ed) 22 { 23 st=p[be++]; 24 int site1= st.mm; 25 if(site1==65535) 26 { 27 printf("%d\n",st.ans); 28 flag=be-1; 29 return ; 30 } 31 for(int i=0;i<=3;i++) 32 { 33 for(int j=0;j<=3;j++) 34 { 35 int site; 36 site=site1; 37 for(int t=i*4;t<=i*4+3;t++) 38 site^=(1<<(t)); 39 for(int t=j%4;t<=15;t+=4) 40 site^=(1<<(t)); 41 site^=(1<<(i*4+j)); 42 if(!visi[site]) 43 { 44 p[ed]=st; 45 p[ed].r=3-i; 46 p[ed].c=3-j; 47 p[ed].ans++; 48 p[ed].mm=site; 49 p[ed++].pre=be-1; 50 visi[site]=true; 51 } 52 } 53 } 54 } 55 } 56 void print(int n) 57 { 58 if(p[n].pre==-1) 59 return ; 60 printf("%d %d\n",p[n].r+1,p[n].c+1); 61 print(p[n].pre); 62 63 } 64 int main() 65 { 66 int id=0; 67 for(int i=0;i<4;i++) 68 { 69 scanf("%s",ss); 70 for(int j=0;j<4;j++) 71 { 72 id<<=1; 73 if(ss[j]=='-') id+=1; 74 } 75 } 76 bfs(id); 77 print(flag); 78 return 0; 79 }
另外的做法打表,把进行的16步翻转列出来。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define maxn 100000 5 using namespace std; 6 struct node 7 { 8 int r,c,pre,ans,mm; 9 }p[maxn],st,st1; 10 int id; 11 int flag; 12 bool visi[maxn]; 13 char ss[maxn]; 14 int sb[]={63624, 62532, 61986, 61713, 36744, 20292, 12066, 7953, 35064, 17652, 8946, 4593, 34959, 17487, 8751, 4383}; 15 void bfs(int m) 16 { 17 18 int be=0,ed=0; 19 p[ed].c=p[ed].r=p[ed].pre=-1; 20 p[ed].ans=0; 21 p[ed++].mm=m; 22 visi[m]=true; 23 while(be!=ed) 24 { 25 st=p[be++]; 26 int site1= st.mm; 27 if(site1==65535) 28 { 29 printf("%d\n",st.ans); 30 flag=be-1; 31 return ; 32 } 33 for(int i=0;i<16;i++) 34 { 35 int site = site1; 36 site ^= sb[i]; 37 if(!visi[site]) 38 { 39 p[ed]=st; 40 p[ed].r=i/4; 41 p[ed].c=i%4; 42 p[ed].ans++; 43 p[ed].mm=site; 44 p[ed++].pre=be-1; 45 visi[site]=true; 46 } 47 } 48 } 49 } 50 void print(int n) 51 { 52 if(p[n].pre==-1) 53 return ; 54 print(p[n].pre); 55 printf("%d %d\n",p[n].r+1,p[n].c+1); 56 } 57 58 int main() 59 { 60 int id=0; 61 for(int i=0;i<4;i++) 62 { 63 scanf("%s",ss); 64 for(int j=0;j<4;j++) 65 { 66 id<<=1; 67 if(ss[j]=='-') id+=1; 68 } 69 } 70 bfs(id); 71 print(flag); 72 return 0; 73 }