zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
    } 
    
    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:提取问题之间的共同点,可以减少重复

  • 相关阅读:
    webpack
    Js数组和字符串常用方法
    Vue.js 2.0 快速上手
    雅虎前端优化的35条军规
    前端问题大杂烩
    Java和js的区别,以及Java和c的区别
    前后端联调
    99%的人都理解错了HTTP中GET与POST的区别
    vue项目目录
    vuex入门
  • 原文地址:https://www.cnblogs.com/-ifrush/p/10143144.html
Copyright © 2011-2022 走看看