uva-101 搬砖问题(不定长数组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的位置上的木块情况

大神的代码:

#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

const int maxn=30;
int n;
vector<int> pile[maxn];
//找到木块a,并用引用&返回结果 
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;
}

void clear_above(int p,int h){
    for(int i=1+h;i<pile[p].size();i++){
        int b=pile[p][i];
        pile[b].push_back(b);
    }
    pile[p].resize(h+1);
}

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){
        if(s1=="quit")break;
        cin>>a>>s2>>b;//cin不吃空格 
        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就是类似于一个数组的容器,内容比数组更加全面。很多操作都有自己的函数可以直接拿过来进行使用。主要函数就是:

v.push_back(k); 尾插元素;
v.insert(it,k); 在任意位置插入元素;
v.eraser(it,it+k); 删除任意元素;
v.size(); 容量;
v.clear(); 清空容器;
v.empty(); 判断容器是否为空;
reverse(v.begin(),v.end());反转任意段元素
sort(v.begin(),v.end(),cmp);sort排序默认由小到大,cmp可以自由规定排序规则。

此外,答案将四种指令抽象处理,只用了 clear_above,pile_onto两个动作来组合完成所有指令,减少了重复与冗长。

ps:提取问题之间的共同点,可以减少重复

posted @ 2018-12-19 14:42  易如鱼  阅读(259)  评论(1编辑  收藏  举报