- 题目大意
先理解给出的四个移动方式:
- move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;
-
move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;
-
pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;
-
pile a over b:把a连同a上木块移到含b的堆上。
然后根据条件来移动即可。
- 解题思路
如果把每个情况都写出来肯定很麻烦,所以首先先找出他们的共同点然后来写出算法,这样就会简单很多,如
- 找到某木块
- 将某木块上的木块放回原位
- 将某木块及其上面木块移动到另一个木块上
- 代码
#include<string> #include<vector> #include<iostream> using namespace std; int n; vector<int> num[24]; void find(int a, int & i, int &j ) { for (i = 0; i < n; i++) for (j = 0; j< num[i].size(); j++) if (num[i][j] == a) return; } void over(int j, int h) { for (int i = h + 1; i < num[j].size(); i++) { int b = num[j][i]; num[b].push_back(b); } num[j].resize(h + 1); } void renew(int p, int h, int g ) { for (int i = h; i < num[p].size(); i++) num[g].push_back(num[p][i]); num[p].resize(h); } int main() { int a, b; cin >> n; string s1, s2; for (int i = 0; i < n; i++) num[i].push_back(i); while (cin >> s1) { if (s1 == "quit") { for (int i = 0; i < n; i++) { cout << i<<":"; for (int j = 0; j < num[i].size(); j++) cout <<" "<<num[i][j]; cout << endl; } break; } cin >> a >> s2 >> b; int q, w, e, r; find(a, q, e); find(b, w, r); if (q == w) continue; if (s2 == "onto") over(w, r); if (s1 == "move") over(q, e); renew(q, e, w); } system("pause"); return 0; }