zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4305184.html
Copyright © 2011-2022 走看看