zoukankan      html  css  js  c++  java
  • 【HDOJ】3220 Alice’s Cube

    状态压缩+逆向BFS。
    方向数组就是任意相邻的两点(初始化时减1),每个顶点均有4个相邻点。因此,共有16*4/2=32个方向。按序排列即可找到。

     1 /* 3220 */
     2 #include <iostream>
     3 #include <queue>
     4 #include <algorithm>
     5 #include <cstdio>
     6 #include <cstring>
     7 using namespace std;
     8 
     9 
    10 char visit[1<<17];
    11 const int end = 0x0ff;
    12 int beg;
    13 int dir[32][2] = {
    14     1,2, 1,3, 1,5, 1,9,
    15     2,4, 2,6, 2,10,
    16     3,4, 3,7, 3,11,
    17     4,8, 4,12,
    18     5,6, 5,7, 5,13,
    19     6,8, 6,14,
    20     7,8, 7,15,
    21     8,16,
    22     9,10, 9,11, 9,13,
    23     10,12, 10,14,
    24     11,12, 11,15,
    25     12,16,
    26     13,14, 13,15,
    27     14,16,
    28     15,16
    29 };
    30 
    31 void bfs() {
    32     int i, j, k, tmp;
    33     queue<int> Q;
    34     int a, b, s;
    35     char t;
    36     
    37     memset(visit, -1, sizeof(visit));
    38     visit[end] = 0;
    39     Q.push(end);
    40     
    41     while (!Q.empty()) {
    42         s = Q.front();
    43         Q.pop();
    44         t = visit[s];
    45         if (t >= 3)
    46             continue;
    47         ++t;
    48         for (i=0; i<32; ++i) {
    49             a = s & (1<<dir[i][0]);
    50             b = s & (1<<dir[i][1]);
    51             if (a ^ b) {
    52                 tmp = (s ^ (1<<dir[i][0])) ^ (1<<dir[i][1]);                        
    53                 if (visit[tmp] < 0) {
    54                     visit[tmp] = t;
    55                     Q.push(tmp);
    56                 }
    57             }
    58         }
    59     }
    60 }
    61 
    62 void init() {
    63     int i;
    64     
    65     for (i=0; i<32; ++i) {
    66         --dir[i][0];
    67         --dir[i][1];
    68     }
    69     
    70     bfs();
    71 }
    72 
    73 int main() {
    74     int t, tt;
    75     int i, j, k;
    76     
    77     #ifndef ONLINE_JUDGE
    78         freopen("data.in", "r", stdin);
    79         freopen("data.out", "w", stdout);
    80     #endif
    81     
    82     init();
    83     scanf("%d", &tt);
    84     for (t=1; t<=tt; ++t) {
    85         beg = 0;
    86         for (i=15; i>=0; --i) {
    87             scanf("%d", &j);
    88             if (j)
    89                 beg |= (1<<i);
    90         }
    91         k = visit[beg];
    92         if (k < 0)
    93             printf("Case #%d: more
    ", t);
    94         else
    95             printf("Case #%d: %d
    ", t, k);
    96     }
    97     
    98     return 0;
    99 }
  • 相关阅读:
    关于xutils中的BitmapUtil实现简单的缓存和下载
    自定义spinner
    Dart格式化输出
    使用 dsc_extractor 导出 dyld_shared_cache_arm64
    iOS11 获取手机已安装应用列表
    恢复二进制文件中的block符号表
    iOS 反反注入 修改__RESTRICT,__restrict工具
    Node的调试
    UVa10131
    UVa116
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4308996.html
Copyright © 2011-2022 走看看