E - The Blocks Problem ( UVA - 101)
阿新 • • 發佈:2018-02-10
num continue blog while break ++ log pos 很多
- 題目大意
先理解給出的四個移動方式:
- 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; }
E - The Blocks Problem ( UVA - 101)