SOJ 1515. 魔版C
题目大意:题目和SOJ. 1150相似,只是魔板的操作有所不同。
代码如下:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <set> 5 using namespace std; 6 7 class MagicPanel { 8 public: 9 void operateA() { 10 up = up % 100 * 100 + up / 100; 11 down = down % 100 * 100 + down / 100; 12 } 13 14 void operateB() { 15 up = up % 1000 * 10 + up / 1000; 16 down = down % 1000 * 10 + down / 1000; 17 } 18 19 void operateC() { 20 int u1 = up / 100 % 10; 21 int u2 = up / 10 % 10; 22 int d1 = down / 100 % 10; 23 int d2 = down / 10 % 10; 24 25 up = up / 1000 * 1000 + u2 * 100 + d2 * 10 + up % 10; 26 down = down / 1000 * 1000 + u1 * 100 + d1 * 10 + down % 10; 27 } 28 MagicPanel(int u = 0, int d = 0) { 29 up = u; 30 down = d; 31 parent = -1; 32 op = '\0'; 33 } 34 MagicPanel(const MagicPanel & mp) { 35 up = mp.up; 36 down = mp.down; 37 parent = mp.parent; 38 op = mp.op; 39 } 40 void init() { 41 up = 1234; 42 down = 5678; 43 parent = -1; 44 op = '\0'; 45 } 46 int up; 47 int down; 48 int parent; 49 char op; 50 }; 51 typedef pair<int, int> P; 52 vector<MagicPanel> panels; 53 set< P > s; 54 55 bool test(const P & p, const P & ep) { 56 return p == ep; 57 } 58 59 int main() { 60 int n; 61 while (cin >> n, n != -1) { 62 panels.clear(); 63 s.clear(); 64 65 int temp; 66 int up = 0; 67 for (int i = 0; i < 4; i++) { 68 cin >> temp; 69 up = up * 10 + temp; 70 } 71 int down = 0; 72 for (int i = 0; i < 4; i++) { 73 cin >> temp; 74 down = down * 10 + temp; 75 } 76 77 P ep = P(up, down); 78 79 bool find = false; 80 MagicPanel bPanel; 81 bPanel.init(); 82 panels.push_back(bPanel); 83 P sp = P(bPanel.up, bPanel.down); 84 s.insert(sp); 85 if (test(sp, ep)) { 86 find = true; 87 } 88 89 int step = 0; 90 int fp = 0; 91 while (!find && step < n) { 92 step++; 93 94 int rp = panels.size(); 95 96 // 每一层 97 while (fp < rp) { 98 MagicPanel mp = panels[fp]; 99 100 MagicPanel mpA(mp); 101 mpA.operateA(); 102 mpA.parent = fp; 103 mpA.op = 'A'; 104 105 P pa = P(mpA.up, mpA.down); 106 if (s.find(pa) == s.end()) { 107 // 找不到 108 s.insert(pa); 109 panels.push_back(mpA); 110 } 111 if (test(pa, ep)) { 112 find = true; 113 break; 114 } 115 116 MagicPanel mpB(mp); 117 mpB.operateB(); 118 mpB.parent = fp; 119 mpB.op = 'B'; 120 121 P pb = P(mpB.up, mpB.down); 122 if (s.find(pb) == s.end()) { 123 s.insert(pb); 124 panels.push_back(mpB); 125 } 126 if (test(pb, ep)) { 127 find = true; 128 break; 129 } 130 131 MagicPanel mpC(mp); 132 mpC.operateC(); 133 mpC.parent = fp; 134 mpC.op = 'C'; 135 136 P pc = P(mpC.up, mpC.down); 137 if (s.find(pc) == s.end()) { 138 s.insert(pc); 139 panels.push_back(mpC); 140 } 141 if (test(pc, ep)) { 142 find = true; 143 break; 144 } 145 146 fp++; 147 } 148 } 149 150 if (find) { 151 cout << step; 152 string op; 153 int k = panels.size() - 1; 154 while (panels[k].parent != -1) { 155 op += panels[k].op; 156 k = panels[k].parent; 157 } 158 if (!op.empty()) { 159 cout << " " << string(op.rbegin(), op.rend()); 160 } 161 cout << endl; 162 } else { 163 cout << -1 << endl; 164 } 165 166 167 } 168 169 return 0; 170 }