日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(STL,vector)木块问题

發布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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合適

#include<iostream> #include<algorithm> #include<cstdio> #include<string> #include<vector> 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){//p和h是需要通過這個函數求的,由于是引用,所以return后p,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 m=pile[p][i];pile[m].push_back(m);}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;cin >> n;string s1, s2;for (int i = 0; i < n; i++)pile[i].push_back(i);while (cin >> s1 ,s1!="quit"){ cin>> 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; }

總結

以上是生活随笔為你收集整理的(STL,vector)木块问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。