版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuewenyao/article/details/81741734
题目链接:The Blocks Problem
题意:从左到右有n个木块,编号为0~n-1 ,要求模拟一下四种操作(a,b是木块的编号)
**move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面。
**move a over b: 把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。
**pile a onto b:把b及上面的木块整体摞在b所偶在木块堆的顶部,
**pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
分析:每一个木块堆的高度不确定,所以用vector来保存比较合适,而木块堆的个数不超过n,所以用一个数组来存储就可以。
代码如下(刘汝佳上的板子):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 101;
vector<int>pile[maxn];
int n ;
//找木块儿 a 所在的pp 和h , 以引用的形式返回调用者
void find_block(int a , int &p , int &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 b = pile[p][i];
pile[b].push_back(b);
}
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 ;
string s1 ,s2;
cin>>n;
for(int i = 0 ; i < n ; i ++)
pile[i].push_back(i);
while(cin>>s1>>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 ;
}
代码分析:代码的核心就是vector<int>pile[maxn],所有的操作都是基于vector进行的,vector就像是一个二维数组,知识第一个一维的是固定的maxn,但第二维的大小不固定。
扫描二维码关注公众号,回复:
4924854 查看本文章
提示:vector头文件中的vector是一个不定长数组,可以用clear()清空,resize()改变大小,push_back()和pop_back()在尾部添加和删除元素,用empty()测试容器是否为空,vector之间可以直接赋值或者作为函数的返回值。