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

 

你可能感兴趣的:(BR)