The Blocks Problem (木塊問題) (vector)
阿新 • • 發佈:2019-01-04
題意:從左到右有n個木塊,編號為0~n-1 ,要求模擬一下四種操作(a,b是木塊的編號)
**move a onto b: 把a和b上方的木塊全部歸位,然後把a摞在b上面。
**move a over b: 把a上方的木塊全部歸位,然後把a放在b所在木塊堆的頂部。
**pile a onto b:把b及上面的木塊整體摞在b所偶在木塊堆的頂部,
**pile a over b:把a及上面的木塊整體摞在b所在木塊堆的頂部。
分析:每一個木塊堆的高度不確定,所以用vector來儲存比較合適,而木塊堆的個數不超過n,所以用一個數組來儲存就可以。
程式碼如下(劉汝佳上的板子):
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn = 101; vector<int>pile[maxn]; int n ; //找木塊兒 a 所在的pp 和h , 以引用的形式返回呼叫者 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 ; } } //把第p堆高度為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); } pile[p].resize(h+1); } //把第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 ; string s1 ,s2; cin>>n; 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(); return 0 ; }
程式碼分析:程式碼的核心就是vector<int>pile[maxn],所有的操作都是基於vector進行的,vector就像是一個二維陣列,知識第一個一維的是固定的maxn,但第二維的大小不固定。
提示:vector標頭檔案中的vector是一個不定長陣列,可以用clear()清空,resize()改變大小,push_back()和pop_back()在尾部新增和刪除元素,用empty()測試容器是否為空,vector之間可以直接賦值或者作為函式的返回值。