(STL,vector)木块问题
題目:
輸入n,得到編號為0~n-1的木塊,分別擺放在順序排列編號為0~n-1的位置。現對這些木塊進行操作,操作分為四種。
1、move a onto b:把木塊a、b上方的木塊放回各自的原位,再把a放到b上;
2、move a over b:把a上方的木塊放回各自的原位,再把a放到b所在的木塊的堆的上面;
3、pile a onto b:把b上方的木塊放回各自的原位,再把a連同a上的木塊整體移到b上;
4、pile a over b:把a連同a上方木塊移到b所在的木塊的堆的上面。
當輸入quit時,結束操作并輸出0~n-1的位置上的木塊情況
Sample Input
10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
quit
Sample Output
0: 0
1: 1 9 2 4
2:
3: 3
4:
5: 5 8 7 6
6:
7:
8:
9:
分析與解答:
1.提取指令之間的共同點,編寫函數以減少代碼量
經觀察:
pile a onto b和move a onto b,在移動之前,都需要把b上方木塊歸位。
move a onto b和move a over b,在移動之前,都需要把a上方木塊歸位。
兩個都是一個意思,把第p堆高度位h的木塊上方的所有木塊移回原位
四條指令在做完預備工作(歸位)之后,都是把a這個堆高度位h及上方的木塊整體移到b這個堆整體的頂部
有人要問為什么需要有h
如果
2:2 3 4 5
6:6 7 8 9
pile 3 over 6
2:2
6:6 7 8 9 3 4 5
懂了吧,并不是只有從最底部開始移動
2.利用vector
vector< int>pile[maxn]像是一個二維數組,只不過一維大小固定二位不固定
vector< int>a
a.size()讀取大小
a.resize(b)改變大小(只保留前b個數,下標0到b-1的元素)
a.push_back(b)向尾部添加元素b
a.pop_back()刪除最后一個元素
本題每個木塊堆的高度不確定,而木塊堆的個數確定有n個,因此用vector合適
總結
以上是生活随笔為你收集整理的(STL,vector)木块问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ssm框架登录代码,求一个SS
- 下一篇: (DAG+固定终点的最长路和最短路)硬币