• 【HDOJ】3459 Rubik 2×2×2


    模拟+DFS。

      1 /* 3459 */
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 
      6 #define MAXN    10
      7 #define MAXL    1005
      8 
      9 #define U0        map[0][2]
     10 #define U1        map[0][3]
     11 #define U2        map[1][3]
     12 #define U3        map[1][2]
     13 
     14 #define F0        map[2][2]
     15 #define F1        map[2][3]
     16 #define F2        map[3][3]
     17 #define F3        map[3][2]
     18 
     19 #define R0        map[2][4]
     20 #define R1        map[2][5]
     21 #define R2        map[3][5]
     22 #define R3        map[3][4]
     23 
     24 #define L0        map[2][0]
     25 #define L1        map[2][1]
     26 #define L2        map[3][1]
     27 #define L3        map[3][0]
     28 
     29 #define B0        map[2][6]        
     30 #define B1        map[2][7]
     31 #define B2        map[3][7]
     32 #define B3        map[3][6]
     33 
     34 #define D0        map[4][2]
     35 #define D1        map[4][3]
     36 #define D2        map[5][3]
     37 #define D3        map[5][2]
     38 
     39 
     40 const int n = 6;
     41 const int m = 8;
     42 int deep;
     43 char map[MAXN][MAXN];
     44 char op[MAXL];
     45 
     46 bool isValid() {
     47     bool ret;
     48     ret =
     49         (U0==U1 && U0==U2 && U0==U3) &&
     50         (L0==L1 && L0==L2 && L0==L3) &&
     51         (R0==R1 && R0==R2 && R0==R3) &&
     52         (F0==F1 && F0==F2 && F0==F3) &&
     53         (B0==B1 && B0==B2 && B0==B3) &&
     54         (D0==D1 && D0==D2 && D0==D3) ;
     55     return ret;    
     56 }
     57 
     58 void rotateX() {
     59     char ch, ch1, ch2;
     60     // handle right
     61     ch = R0;
     62     R0 = R1;
     63     R1 = R2;
     64     R2 = R3;
     65     R3 = ch;
     66     
     67     ch1 = F1;
     68     ch2 = F2;
     69     // up -> front
     70     F1 = U1;
     71     F2 = U2;
     72     // back -> up
     73     U1 = B3;
     74     U2 = B0;
     75     // down -> back
     76     B0 = D2;
     77     B3 = D1;
     78     // front -> down
     79     D1 = ch1;
     80     D2 = ch2;
     81 }
     82 
     83 void rotateY() {
     84     char ch, ch0, ch1;
     85     
     86     // handle up
     87     ch = U0;
     88     U0 = U1;
     89     U1 = U2;
     90     U2 = U3;
     91     U3 = ch;
     92     
     93     ch0 = F0;
     94     ch1 = F1;
     95     // left -> front
     96     F0 = L0;
     97     F1 = L1;
     98     // back -> left
     99     L0 = B0;
    100     L1 = B1;
    101     // right -> back
    102     B0 = R0;
    103     B1 = R1;
    104     // front -> right
    105     R0 = ch0;
    106     R1 = ch1;
    107 }
    108 
    109 void rotateZ() {
    110     char ch, ch2, ch3;
    111     
    112     // handle front
    113     ch = F0;
    114     F0 = F1;
    115     F1 = F2;
    116     F2 = F3;
    117     F3 = ch;
    118     
    119     ch2 = U2;
    120     ch3 = U3;
    121     // right -> up
    122     U3 = R0;
    123     U2 = R3;
    124     // down -> right
    125     R0 = D1;
    126     R3 = D0;
    127     // left -> down
    128     D0 = L1;
    129     D1 = L2;
    130     // up -> left
    131     L1 = ch2;
    132     L2 = ch3;
    133 }
    134 
    135 bool dfs(int d) {
    136     if (d == deep)
    137         return isValid();
    138     
    139     op[d] = 'X';
    140     rotateX();
    141     if (dfs(d+1))
    142         return true;
    143     rotateX();
    144     rotateX();
    145     rotateX();
    146     
    147     op[d] = 'Y';
    148     rotateY();
    149     if (dfs(d+1))
    150         return true;
    151     rotateY();
    152     rotateY();
    153     rotateY();
    154     
    155     
    156     op[d] = 'Z';
    157     rotateZ();
    158     if (dfs(d+1))
    159         return true;
    160     rotateZ();
    161     rotateZ();
    162     rotateZ();
    163     
    164     return false;
    165 }
    166 
    167 int main() {
    168     int i, j, k;
    169     
    170     #ifndef ONLINE_JUDGE
    171         freopen("data.in", "r", stdin);
    172         freopen("data.out", "w", stdout);
    173     #endif
    174     
    175     while (1) {
    176         for (i=0; i<n; ++i)
    177             scanf("%s", map[i]);
    178         if (map[0][2] == '.')
    179             break;
    180         deep = 0;
    181         while (1) {
    182             if (dfs(0))
    183                 break;
    184             ++deep;
    185         }
    186         op[deep] = '';
    187         puts(op);
    188     }
    189     
    190     return 0;
    191 }
  • 相关阅读:
    js数组删除数组元素!收集
    ComponentArt MethodNeedDataSource etc.
    ComponentArt Grid Tips
    jira的附件位置如何查看
    有空来学习
    给你的windows设置博客园客户端,还等什么呢,赶快行动吧
    需要做的事
    那些事
    转帖:教你怎么偷懒
    买了电脑要做的几件事
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4305184.html
Copyright © 2020-2023  润新知