UVA 101 木块

           这是书上的一个例题,具体代码分析就不多说了,在这里主要是想总结一下书中提到的vector的用法。

      vector是包含在#include<vector>的头文件中。下面,我们定义vector<int> a , 以此讨论它的用法。

      首先要说明一点,这里的a相当于一个一维数组(数组a中的默认元素为0),以此类推如果我们定义vector<int> a[10],那么a就相当于一个二维数组。

                  一、读取它的 大小

            这点需运用 “a.size()”,其中括号里什么都没有,引号里的内容可以与c语言中字符串函数的“strlen(a)”,他们都是返回一个具体数值,这个数值就是长度。

                  二、改变它的大小

            这点需运用“a.resize()”   , 如果我们使用"a.resize(3)" ,那么此时数组a的长度就为3,其包含元素a[0], a[1], a[2], 若原来的长度大于3,比如是5,那么改变后a[3],a[4]都将被删掉。

                三、向尾部添加元素

          这点需运用“a.push_back()”, 这里的括号只能放一个元素,如“a.push_back(5)”,相当于在a的尾部添加一个5,同时数组长度也就是“a.size()”也相应加一。

              四、删除最后一个元素

        这点需运用“a.pop_back()” ,其中括号里什么都没有,如果原来a.size() = 3 并且 a[2] = 2, 那么使用a.pop_back后a[2]就被删除,同时数组长度也就是a.size()也相应减一。

       
<div style="text-align: left;"><pre name="code" class="cpp">#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn = 30;
vector<int> pile[maxn];
int n;
//返回木块m所在的位置和高度
void finding(int m, int &hm, int &pm)
{
    for(pm = 0; pm < n; pm++)
        for(hm = 0; hm < pile[pm].size(); hm++)
           if(pile[pm][hm] == m) return ;
}
//将第p堆高度为h的木块上方所有的木块移回原位
void return_(int h, int p)
{
    for(int i = h+1; i < pile[p].size(); i++)
        pile[pile[p][i]].push_back(pile[p][i]); //将木块pile[p][i]移回原位
    pile[p].resize(h+1); //p应只保留下标为0-h的元素

//将第pm堆高度为h及其上方所有的木块移到pn的顶部
void pile_(int hm, int pm, int pn)
{
    for(int i = hm; i < pile[pm].size(); i++)
        pile[pn].push_back(pile[pm][i]);
    pile[pm].resize(hm); //pm应只保留下标为0-(hm-1)的元素
}
void print()
{
    for(int i = 0; i < n; i++){
        cout << i << ':';
        for(int j = 0; j < pile[i].size(); j++)
            printf(" %d",pile[i][j]);
        printf("\n");
    }
}
int main()
{
    string s1, s2;
    int a, b;
    cin >> n;
    for(int i = 0; i < n; i++)
        pile[i].push_back(i);
    while(cin >> s1 && s1 != "quit" && cin >> a >> s2 >> b){

        int pa, ha, pb, hb;
        finding(a, ha, pa);
        finding(b, hb, pb);
        if(pa == pb) continue;
        if(s1 == "move") return_(ha, pa);
        if(s2 == "onto") return_(hb, pb);
        pile_(ha, pa, pb);

    }
    print();
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值