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 }
View Code

另外的做法打表,把进行的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 }
View Code

 

posted @ 2013-08-03 19:08  null1019  阅读(155)  评论(0编辑  收藏  举报