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 = '';
 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 = '';
 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 }
原文地址:https://www.cnblogs.com/mchcylh/p/4877576.html