zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    第六日会议博客
    第五日会议博客
    第四日会议博客
    第三日会议博客
    第二日会议博客
    第一日会议博客
    Alpha总结展望——前事不忘后事之师
    请坐,我们是专业团队——Alpha冲刺
    微信小程序测试总结
    WeChair项目Beta冲刺(4/10)
  • 原文地址:https://www.cnblogs.com/mchcylh/p/4877576.html
Copyright © 2011-2022 走看看