Uva 101: 木块问题(The Blocks Problem)

本文介绍了如何使用C++实现堆排序算法,并详细解释了`search_num`、`homing`和`move`函数的作用,展示了在处理特定问题时对堆数据结构的操作过程。
摘要由CSDN通过智能技术生成

看着算法书看到了这一题,想着不能只看不做,就想着做了一下

算法书上的描述太抽象了,就网上找了其他的描述

当然去看英文描述是最准确的,算法书上说是哪一个oj网来着?我给忘了

STL还是很好用的

代码如下:

#include<vector>
#include<iostream>
#include<string>
using namespace std;
void search_num(int a, int &x, int &y);//找到a的位置
void homing(const int &x, const int &y);//第x堆,第y高的木块上方的木块归位
void move(const int &x, const int &y, const int &z);//第x堆,第y高的木块和上方的木块放在第z堆上方
vector<vector<int>> blocks;
int N;

int main(void)
{
    cin >> N, blocks.resize(N);
    for(int i = 0; i < N; i++)
        blocks[i].push_back(i);
    string str1, str2;
    while(true)
    {
        cin >> str1;
        if(str1 == "quit")  break;
        int a, b, xa, ya, xb, yb;
        cin >> a >> str2 >> b;
        search_num(a, xa, ya), search_num(b, xb, yb);
        if(xa == xb)  continue;
        if(str1 == "move")
        {
            homing(xa, ya);
            if(str2 == "onto")  homing(xb, yb);
            blocks[xa].pop_back(), blocks[xb].push_back(a);
        }
        else
        {
            if(str2 == "onto")  homing(xb, yb);
            move(xa, ya, xb);
        }
    }
    for(int i = 0; i < N; i++)
    {
        cout << i << ':';
        for(auto it = blocks[i].begin(); it != blocks[i].end(); it++)
            cout << ' ' << *it;
        cout << endl;
    }

    return 0;
}
void search_num(int a, int &x, int &y)
{
    for(x = 0; x < N; x++)
        for(y = 0; y < blocks[x].size(); y++)
            if(blocks[x][y] == a)
                return;
    return;
}
void homing(const int &x, const int &y)
{
    int n_tmp = y;
    while(++n_tmp < blocks[x].size())
        blocks[blocks[x][n_tmp]].push_back(n_tmp);
    blocks[x].resize(y + 1);
    return;
}
void move(const int &x, const int &y, const int &z)//第x堆,第y高的木块和上方的木块放在第z堆上方
{
    int n_tmp = y - 1;
    while(++n_tmp < blocks[x].size())
        blocks[z].push_back(blocks[x][n_tmp]);
    blocks[x].resize(y);
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值