背景: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();
}