题面
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<sstream>
using namespace std;
vector<int> pile[30];
char s1[10],s2[10];
int n;
void find_block(int a,int& p,int& h){
for(p=0;p<n;p++)
for(h=0;h<pile[p].size();h++){
if(a==pile[p][h]) return ;
}
}
void move_back(int p,int h){//将第p摞,h高的木块上方木块全部复位
for(int i=h+1;i<pile[p].size();i++)
pile[pile[p][i]].push_back(pile[p][i]);
//for(int i=h+1;i<pile[p].size();i++) pile[i].pop_back();
pile[p].resize(h+1);
return;
}
void move_onto(int pa,int ha,int pb){//将pa[ha]放置到pb上
pile[pb].push_back(pile[pa][ha]);
pile[pa].pop_back();
return ;
}
void move_over(int pa,int ha,int pb){//将pa,ha及其以上的木块全部依次放置到pb上
for(int i=ha;i<pile[pa].size();i++) pile[pb].push_back(pile[pa][i]);
for(int i=pile[pa].size()-1;i>=ha;i--) pile[pa].pop_back();
return;
}
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(){
// freopen("101.out","w",stdout);
int a,b;
scanf("%d",&n);
for(int i=0;i<n;i++) pile[i].push_back(i);
while(scanf("%s",s1)){
if(strcmp(s1,"quit")==0) break;
scanf("%d%s%d",&a,s2,&b);
int pa,ha,pb,hb;
find_block(a,pa,ha);
find_block(b,pb,hb);
if(a==b||pa==pb) continue;
if(strcmp(s1,"move")==0&&strcmp(s2,"onto")==0){
move_back(pa,ha);
move_back(pb,hb);
move_onto(pa,ha,pb);
}
if(strcmp(s1,"move")==0&&strcmp(s2,"over")==0){
move_back(pa,ha);
move_onto(pa,ha,pb);
}
if(strcmp(s1,"pile")==0&&strcmp(s2,"onto")==0){
move_back(pb,hb);
move_over(pa,ha,pb);
}
if(strcmp(s1,"pile")==0&&strcmp(s2,"over")==0){
move_over(pa,ha,pb);
}
}
print();
return 0;
}
知识点
不定长数组:vector
vector有点像栈,但本质上是数组。
是模板类,声明方式:vector<int> a;vector<string> b;
a.size()读取大小;
a.resize()改变大小; //可用于批量删除栈顶元素
a.clear()清空;
a.empty()测试是否为空;
a.push_back(x)向栈顶添加元素x;
a.pop_back()删去栈顶元素;