• 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
    ",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
    ",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
    ",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
    ",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
  • 相关阅读:
    Thinking in java Chapter10 内部类
    策略设计模式 Strategy模式
    Thinking in java Chapter9 接口
    Thinking in java Chapter8 多态
    Thinking in java Chapter7 复用类
    mock服务
    文件的使用方式
    字符编码与文件处理方式
    各容器类型及内置方法
    python各数据类型及内置方式:
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3235088.html
Copyright © 2020-2023  润新知