HDU5983. Pocket Cube

题目大意

给你一个二阶魔方,问一步操作后是否复原

简要题解

暴力乱搞即可,可以根据给定的那个说明来写。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 namespace my_header {
  4 #define pb push_back
  5 #define mp make_pair
  6 #define pir pair<int, int>
  7 #define vec vector<int>
  8 #define pc putchar
  9 #define clr(t) memset(t, 0, sizeof t)
 10 #define pse(t, v) memset(t, v, sizeof t)
 11 #define bl puts("")
 12 #define wn(x) wr(x), bl
 13 #define ws(x) wr(x), pc(' ')
 14     const int INF = 0x3f3f3f3f;
 15     typedef long long LL;
 16     typedef double DB;
 17     inline char gchar() {
 18         char ret = getchar();
 19         for(; (ret == '\n' || ret == '\r' || ret == ' ') && ret != EOF; ret = getchar());
 20         return ret; }
 21     template<class T> inline void fr(T &ret, char c = ' ', int flg = 1) {
 22         for(c = getchar(); (c < '0' || '9' < c) && c != '-'; c = getchar());
 23         if (c == '-') { flg = -1; c = getchar(); }
 24         for(ret = 0; '0' <= c && c <= '9'; c = getchar())
 25             ret = ret * 10 + c - '0';
 26         ret = ret * flg; }
 27     inline int fr() { int t; fr(t); return t; }
 28     template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); }
 29     template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
 30     template<class T> inline char wr(T a, int b = 10, bool p = 1) {
 31         return a < 0 ? pc('-'), wr(-a, b, 0) : (a == 0 ? (p ? pc('0') : p) : 
 32             (wr(a/b, b, 0), pc('0' + a % b)));
 33     }
 34     template<class T> inline void wt(T a) { wn(a); }
 35     template<class T> inline void wt(T a, T b) { ws(a), wn(b); }
 36     template<class T> inline void wt(T a, T b, T c) { ws(a), ws(b), wn(c); }
 37     template<class T> inline void wt(T a, T b, T c, T d) { ws(a), ws(b), ws(c), wn(d); }
 38     template<class T> inline T gcd(T a, T b) {
 39         return b == 0 ? a : gcd(b, a % b); }
 40     template<class T> inline T fpw(T b, T i, T _m, T r = 1) {
 41         for(; i; i >>= 1, b = b * b % _m)
 42             if(i & 1) r = r * b % _m;
 43         return r; }
 44 };
 45 using namespace my_header;
 46 
 47 int b[30], a[30];
 48 
 49 inline int val(char c) {
 50     return c - 'a';
 51 }
 52 
 53 void X() {
 54     memcpy(a, b, sizeof b);
 55     a[val('u')] = b[val('v')];
 56     a[val('v')] = b[val('x')];
 57     a[val('w')] = b[val('u')];
 58     a[val('x')] = b[val('w')];
 59     a[val('b')] = b[val('n')];
 60     a[val('d')] = b[val('p')];
 61     a[val('f')] = b[val('b')];
 62     a[val('h')] = b[val('d')];
 63     a[val('j')] = b[val('f')];
 64     a[val('l')] = b[val('h')];
 65     a[val('n')] = b[val('j')];
 66     a[val('p')] = b[val('l')];
 67     memcpy(b, a, sizeof a);
 68 }
 69 void Y() {
 70     memcpy(a, b, sizeof b);
 71     a[val('a')] = b[val('b')];
 72     a[val('b')] = b[val('d')];
 73     a[val('c')] = b[val('a')];
 74     a[val('d')] = b[val('c')];
 75     a[val('e')] = b[val('r')];
 76     a[val('f')] = b[val('t')];
 77     a[val('w')] = b[val('e')];
 78     a[val('u')] = b[val('f')];
 79     a[val('p')] = b[val('w')];
 80     a[val('o')] = b[val('u')];
 81     a[val('r')] = b[val('p')];
 82     a[val('t')] = b[val('o')];
 83     memcpy(b, a, sizeof a);
 84 }
 85 void Z() {
 86     memcpy(a, b, sizeof b);
 87     a[val('e')] = b[val('f')];
 88     a[val('f')] = b[val('h')];
 89     a[val('g')] = b[val('e')];
 90     a[val('h')] = b[val('g')];
 91     a[val('i')] = b[val('t')];
 92     a[val('j')] = b[val('s')];
 93     a[val('x')] = b[val('i')];
 94     a[val('w')] = b[val('j')];
 95     a[val('d')] = b[val('x')];
 96     a[val('c')] = b[val('w')];
 97     a[val('t')] = b[val('d')];
 98     a[val('s')] = b[val('c')];
 99     memcpy(b, a, sizeof b);
100 }
101 
102 bool chk() {
103     vector<int> st;
104     st.clear();
105     for (int i = 0; i < 6; ++i) {
106         for (int j = 1; j < 4; ++j) {
107             int k = i * 4 + j - 1;
108             if (b[k] != b[k + 1])
109                 return false;
110         }
111         st.pb(b[i * 4]);
112     }
113     sort(st.begin(), st.end());
114     st.erase(unique(st.begin(), st.end()), st.end());
115     //printf("%d\n", (int)st.size());
116     if (st.size() != 6)
117         return false;
118     return true;
119 }
120 
121 bool judge() {
122     if (chk())
123         return true;
124     X();
125     if (chk()) return true;
126     X(), X();
127     if (chk()) return true;
128     X();
129 
130     Y();
131     if (chk()) return true;
132     Y(), Y();
133     if (chk()) return true;
134     Y();
135 
136     Z();
137     if (chk()) return true;
138     Z(), Z();
139     if (chk()) return true;
140     Z();
141 
142     return false;
143 }
144 
145 int main() {
146 #ifdef lol
147     freopen("5983.in", "r", stdin);
148     freopen("5983.out", "w", stdout);
149 #endif
150 
151     int T;
152     scanf("%d", &T);
153     while (T--) {
154         for (int i = 0; i < 24; ++i)
155             scanf("%d", &b[i]);
156         if (judge())
157             puts("YES");
158         else puts("NO");
159     }
160     return 0;
161 }

 

posted @ 2017-02-23 17:23  ichneumon  阅读(260)  评论(0)    收藏  举报