Uva 101 the block problem 木塊問題(演算法競賽經典入門)STL vector
阿新 • • 發佈:2018-12-16
題目大意:
輸入N,得到編號為0〜N-1的木塊,分別擺放在順序排列編號為0〜N-1的位置。現對這些木塊進行操作,操作分為四種。
1,移動到b:把木塊a,b上的木塊放回各自的原位,再把a放到b上;
2,移動一個b:把一個上的木塊放回各自的原位,再把一個發到含b的堆上;
3,堆放到b:把b上的木塊放回各自的原位,再把a連同a上的木塊移到b上;
4,堆放一個b:把一個連同上木塊移到含b的堆上。
當輸入退出時,結束操作並輸出0〜N-1的位置上的木塊情況
樣品輸入
10
移動9移動1
移動8移動1
移動7移動1
移動6移動1
樁8超過6
樁8
移動2
移動1 移動4超過9
退出
樣本輸出
0:0
1:1 9 2 4
2:
3 :3
4:
5:5 8 7 6
6:
7:
8:
9:
#include<cstdio> #include<cstring> #include<vector> #include<iostream> using namespace std; const int maxn = 30; int n; vector<int> pile[maxn]; //找木塊a所在的pile和height void find_block(int a, int& p,int& h) { for (p = 0; p < n; p++) for (h = 0; h < pile[p].size(); h++) if (pile[p][h] == a) return; } //把堆高度為h的木塊上方的所有木塊移回原位 void clear_above(int p, int h) { for (int i = h + 1; i < pile[p].size(); i++) { int b = pile[p][i]; pile[b].push_back(b);//把b放回原位 } pile[p].resize(h + 1); //pile只應保留下標為0~h的元素 } //把第p堆高度為h及上方的木塊整體移動到p2堆的頂部 void pile_onto(int p, int h, int p2) { for (int i = h; i < pile[p].size(); i++) pile[p2].push_back(pile[p][i]); pile[p].resize(h); } void print() { for (int i = 0; i < n; i++) { printf("%d:", i); for (int j = 0; j < pile[i].size(); j++) printf(" %d", pile[i][j]); printf("\n"); } } int main() { int a, b; cin >> n; string s1, s2; for (int i = 0; i < n; i++) pile[i].push_back(i); while (cin>> s1 >> a >> s2 >> b) { int pa, pb, ha, hb; find_block(a, pa, ha); find_block(b, pb, hb); if (pa == pb) continue; if (s2 == "onto") clear_above(pb, hb); if (s1 == "move") clear_above(pa, ha); pile_onto(pa, ha, pb); } print(); system("pause"); return 0; }