• USACOTrainning.The Clocks


    有九个Clock,只有4个点,然后有9种操作,可以推动某些Clock前进一个刻度,问说最少的操作数。

    然后算错了4^9还是蛮小的=2^10 * 2^8=1024 * 256。

    用4进制来表示闹钟完全可行的。

    然后我就用了3个4进制数来表示,消耗(4^3)*(4^3)*(4^3)空间,空间是一样的,囧。

    然后用Vector来BFS。

    1 #include <iostream>
    2 #include <string>
    3 #include <algorithm>
    4 #include <string.h>
    5 #include <vector>
    6 #include <math.h>
    7 #include <time.h>
    8 #include <queue>
    9  using namespace std;
    10
    11  struct STA
    12 {
    13 int a, b, c; //表示3行的状态
    14   int toward; //表示从哪个节点BFS过来的
    15   int op; //操作的方法
    16 STA(int aa, int bb, int cc) : a(aa), b(bb), c(cc)
    17 {
    18 toward = -1;
    19 }
    20 STA(int aa, int bb, int cc, int tt)
    21 {
    22 a = aa, b = bb, c = cc;
    23 toward = tt;
    24 }
    25 STA()
    26 {
    27 toward = -1;
    28 }
    29 };
    30
    31 //4 ^ 3 = 64
    32 bool use[70][70][70];
    33 int ch[3][3];
    34
    35 vector<STA>sta;
    36 vector<int>ans;
    37
    38 int turn(int x)
    39 {
    40 if(x == 12) return 0;
    41 if(x == 3) return 1;
    42 if(x == 6) return 2;
    43 if(x == 9) return 3;
    44 }
    45
    46 int makeState(int a, int b, int c)
    47 {
    48 a = turn(a);
    49 b = turn(b);
    50 c = turn(c);
    51
    52 return a + 4 * b + 16 * c;
    53 }
    54
    55 void ready()
    56 {
    57 int beg[3];
    58 for(int i = 0; i < 3; i++)
    59 {
    60 beg[i] = makeState(ch[i][0], ch[i][1], ch[i][2]);
    61 }
    62
    63 sta.push_back(STA(beg[0], beg[1], beg[2]));
    64 use[beg[0]][beg[1]][beg[2]] = true;
    65 }
    66
    67 void make(int& num, int d)
    68 {
    69 int val[3];
    70 val[0] = num % 4;
    71 val[1] = (num / 4) % 4;
    72 val[2] = num / 16;
    73
    74 val[d] = (val[d] + 1) % 4;
    75 num = val[0] + 4 * val[1] + 16 * val[2];
    76 }
    77
    78 void make(char ch, int& a, int& b, int& c)
    79 {
    80 switch(ch)
    81 {
    82 case 'A':
    83 make(a, 0);
    84 break;
    85 case 'B':
    86 make(a, 1);
    87 break;
    88 case 'C':
    89 make(a, 2);
    90 break;
    91 case 'D':
    92 make(b, 0);
    93 break;
    94 case 'E':
    95 make(b, 1);
    96 break;
    97 case 'F':
    98 make(b, 2);
    99 break;
    100 case 'G':
    101 make(c, 0);
    102 break;
    103 case 'H':
    104 make(c, 1);
    105 break;
    106 case 'I':
    107 make(c, 2);
    108 break;
    109 }
    110 }
    111
    112
    113
    114 STA operate(STA s, int j, int from)
    115 {
    116 int a, b, c;
    117 a = s.a, b = s.b, c = s.c;
    118
    119 switch(j)
    120 {
    121 case 0:
    122 make('A', a, b, c);
    123 make('B', a, b, c);
    124 make('D', a, b, c);
    125 make('E', a, b, c);
    126 break;
    127 case 1:
    128 make('A', a, b, c);
    129 make('B', a, b, c);
    130 make('C', a, b, c);
    131 break;
    132 case 2:
    133 make('B', a, b, c);
    134 make('C', a, b, c);
    135 make('E', a, b, c);
    136 make('F', a, b, c);
    137 break;
    138 case 3:
    139 make('A', a, b, c);
    140 make('D', a, b, c);
    141 make('G', a, b, c);
    142 break;
    143 case 4:
    144 make('B', a, b, c);
    145 make('D', a, b, c);
    146 make('E', a, b, c);
    147 make('F', a, b, c);
    148 make('H', a, b, c);
    149 break;
    150 case 5:
    151 make('C', a, b, c);
    152 make('F', a, b, c);
    153 make('I', a, b, c);
    154 break;
    155 case 6:
    156 make('D', a, b, c);
    157 make('E', a, b, c);
    158 make('G', a, b, c);
    159 make('H', a, b, c);
    160 break;
    161 case 7:
    162 make('G', a, b, c);
    163 make('H', a, b, c);
    164 make('I', a, b, c);
    165 break;
    166 case 8:
    167 make('E', a, b, c);
    168 make('F', a, b, c);
    169 make('H', a, b, c);
    170 make('I', a, b, c);
    171 break;
    172 }
    173
    174 STA res = STA(a, b, c, from);
    175 res.op = j;
    176 return res;
    177 }
    178
    179 void check(STA s)
    180 {
    181 int a = s.a;
    182 int b = s.b;
    183 int c = s.c;
    184
    185 if(use[a][b][c] == false)
    186 {
    187 sta.push_back(s);
    188 use[a][b][c] = true;
    189 }
    190 }
    191
    192 void go(int i)
    193 {
    194 if(sta[i].toward == -1) return;
    195 go(sta[i].toward);
    196 ans.push_back(sta[i].op + 1);
    197 }
    198
    199 void bfs()
    200 {
    201 for(int i = 0; i < sta.size(); i++)
    202 {
    203 STA s = sta[i];
    204 if(s.a == 0 && s.b == 0 && s.c == 0)
    205 {
    206 go(i);
    207 for(int k = 0; k < ans.size(); k++)
    208 {
    209 if(k == 0) printf("%d", ans[k]);
    210 else printf(" %d", ans[k]);
    211 }
    212 printf("\n");
    213 return;
    214 }
    215
    216 for(int j = 0; j < 9; j++)
    217 {
    218 check(operate(s, j, i));
    219 }
    220 }
    221 }
    222
    223 int main()
    224 {
    225 freopen("clocks.in", "r", stdin);
    226 freopen("clocks.out", "w", stdout);
    227
    228 for(int i = 0; i < 3; i++)
    229 for(int j = 0; j < 3; j++)
    230 scanf("%d", &ch[i][j]);
    231 ready();
    232 bfs();
    233 }
  • 相关阅读:
    锁详解
    消息组件
    分布式锁
    jvm调优
    类加载
    垃圾回收
    Mysql
    redis
    悲观锁和乐光锁
    算法常见
  • 原文地址:https://www.cnblogs.com/litstrong/p/1710487.html
Copyright © 2020-2023  润新知