背景:1Y!!!
注意这根据游戏规则,无论怎样放,如果一个堆有元素,那么最底层元素必是初始在这个堆的元素
思路:模拟整个过程即可。
学习:1.主要是vector容器的一些使用:
a.还没有创建的空间不能用,v[]这种c语言的形式访问(就算reserve的预留空间也不行,除非用resize创建空间,否则只能push_back();)
b.
<span id="transmark"></span>vector<int> v[10]; //相当于创建了一个行数一定,列数可变长的二维数组
我的代码:
#include<iostream> #include<cstdio> #include<string> #include<vector> using namespace std; vector<int> v[25]; int t1,t2,n; struct place{int p,h;}p1,p2; void find_place(int x,int y){ //找到t1,t2目前所在的堆和高度。 for(int i=0;i < n;i++){ for(int j=0;j < v[i].size();j++){ if(v[i][j] == t1) { if(y == x) { p1.p=i; p1.h=j+1; }else{ p2.p=i; p2.h=j+1; } return; } } } } void moveonto(void){ for(int i=v[p1.p].size()-1;i >= p1.h;i--){ //t1上面的数据放回初始位置 v[v[p1.p][i]].push_back(v[p1.p][i]); v[p1.p].pop_back(); } for(int i=v[p2.p].size()-1;i >= p2.h;i--){ //t2上面数据放回初始位置 v[v[p2.p][i]].push_back(v[p2.p][i]); v[p2.p].pop_back(); } v[p2.p].push_back(t1); v[p1.p].pop_back(); } void pileonto(void){ for(int i=v[p2.p].size()-1;i >= p2.h;i--){ //t2上面数据放回初始位置 v[v[p2.p][i]].push_back(v[p2.p][i]); v[p2.p].pop_back(); } vector<int> temp; for(int i=v[p1.p].size()-1;i >=p1.h-1;i--){ temp.push_back(v[p1.p][i]); v[p1.p].pop_back(); } for(;temp.size() != 0;){ v[p2.p].push_back(temp.back()); temp.pop_back(); } } void moveover(void){ for(int i=v[p1.p].size()-1;i >= p1.h;i--){ //t1上面的数据放回初始位置 v[v[p1.p][i]].push_back(v[p1.p][i]); v[p1.p].pop_back(); } v[p2.p].push_back(t1); v[p1.p].pop_back(); } void pileover(void){ vector<int> temp; for(int i=v[p1.p].size()-1;i >=p1.h-1;i--){ temp.push_back(v[p1.p][i]); v[p1.p].pop_back(); } for(;temp.size() != 0;){ v[p2.p].push_back(temp.back()); temp.pop_back(); } } void make(void){ string string1,string2; l1: cin>>string1; if(string1 == "quit") return; cin>>t1>>string2>>t2; find_place(t1,1); find_place(t2,2); if(p1.p == p2.p) goto l1; if(string1 == "move") string2 == "onto" ? moveonto() : moveover(); else string2 == "onto" ? pileonto() : pileover(); goto l1; } void print(void){ for(int i=0;i < n;i++){ printf("%d:",i); for(int j=0;j < v[i].size();j++) printf(" %d",v[i][j]); cout<<endl; } } int main(void){ cin>>n; for(int i=0;i < n;i++) v[i].push_back(i); make(); print(); }