zoukankan      html  css  js  c++  java
  • USACO sec1.4 The Clocks

    用的BFS,将每一个数字除以4,得到四种不同的状态:0 1 2 3,为了实现判重,用2位表示一个状态,整个钟表需要2*9 = 18位,不大;

    题解中第二种做法貌似是推理得到了一般解法。

      1 /*
      2 PROG : clocks
      3 LANG : C++
      4 */
      5 
      6 # include <cstdio>
      7 # include <cstring>
      8 # include <queue>
      9 
     10 using namespace std;
     11 
     12 int ss;
     13 char vis[0x3FFFF + 0x1];
     14 int pre[0x3FFFF + 0x1];
     15 int solu[200];
     16 
     17 /*********************************/
     18 const int od[][6] = 
     19 {
     20     {0,1,3,4, -1,0},
     21     {0,1,2,-1,0,0},
     22     {1,2,4,5,-1,0},
     23     {0,3,6,-1,0,0},
     24     {1,3,4,5,7,-1},
     25     {2,5,8,-1,0,0},
     26     {3,4,6,7,-1,0},
     27     {6,7,8,-1,0,0},
     28     {4,5,7,8,-1,0}
     29 };
     30 /*********************************/
     31 
     32 int flip(int s, int id)
     33 {
     34     int i, t, tt;
     35     for (i = 0; od[id][i] != -1; ++i)
     36     {
     37         //printf("\t%d\t", od[id][i]);
     38         t = 2 * od[id][i];
     39         tt = ((((s>>t)&0x3)+1)&0x3);
     40         s &= ~(0x3<<t);
     41         s |= tt<<t;
     42     }
     43     return s;
     44 }
     45 
     46 void bfs(int ss)
     47 {
     48     int x, y, i;
     49     queue <int> Q;
     50     
     51     if (ss == 0x3FFFF) return ;
     52     
     53     memset(vis, 0, sizeof(vis));
     54     while (!Q.empty()) Q.pop();
     55     
     56     vis[ss] = 1;
     57     Q.push(ss);
     58     while (!Q.empty())
     59     {
     60         x = Q.front(); Q.pop();
     61         for (i = 0; i < 9; ++i)
     62         {
     63             y = flip(x, i);
     64         //printf("%05X\t%d\n", y, i+1);
     65             if (!vis[y])
     66             {
     67                 vis[y] = i+1;
     68                 pre[y] = x;
     69                 if (y == 0x3FFFF)
     70                     return ;
     71                 Q.push(y);
     72             }
     73         }    
     74     }
     75 }
     76 
     77 void print(int s)
     78 {
     79     if (s == ss) return ;
     80     print(pre[s]);
     81     printf("%d", vis[s]);
     82     if (s != 0x3FFFF) putchar(' ');
     83     else putchar('\n');
     84 }
     85 
     86 void init(void)
     87 {
     88     int i, x;
     89     for (ss = i = 0; i < 9; ++i)
     90     {
     91         scanf("%d", &x);
     92         ss |= ((x>>2)<<(i*2));
     93     }
     94     //printf("%0X\n", ss);
     95 }
     96 
     97 int main()
     98 {
     99     freopen("clocks.in", "r", stdin);
    100     freopen("clocks.out", "w", stdout);
    101     
    102     init();
    103     bfs(ss);
    104     print(0x3FFFF);
    105     
    106     fclose(stdin);
    107     fclose(stdout);
    108     
    109     return 0;
    110 }
  • 相关阅读:
    database join
    图像超分辨率重建
    信号处理
    将博客搬至CSDN
    Openstack
    nginx的优化
    CentOS系统的优化
    zabbix服务端客户端部署
    MySQL优化必须调整的10项配置
    TCP三次握手
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2646244.html
Copyright © 2011-2022 走看看