UVA 101 The Blocks Problem【vector】

本文介绍了一种模拟多个方块通过特定操作进行堆叠和移动的算法。主要涉及四种操作:moveaontob、moveaoverb、pileaontob 和 pileaoverb,并使用 C++ 实现。通过两个辅助函数简化复杂度,包括 ret_place 函数和 pileto 函数。此外,还介绍了 vector 的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

source:

点击打开链接


题意:有n个方块,四种操作:

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所在堆的上面。

求经过若干步操作之后方块的分布情况

思路:可以用两种子函数简化:

   1.ret_place(a)函数:将a上面的方块放回原来的位置

   2.pileto(a,b)函数:将a和a上面的方块整体移到b上面


另外关于vector的基本用法之前博文里总结过,见点击打开链接


代码如下:

#include<stdio.h>
#include<vector>
using namespace std;

int belong[26],n;
vector<int> seq[26];

void ret_place(int a)
{
    int t=belong[a];
    int i=seq[t].size();
    while(seq[t][--i]!=a)
    {
        int temp=seq[t][i];
        belong[temp]=temp;
        seq[temp].push_back(temp);
        seq[t].pop_back();
    }
}

void pileto(int a,int b)
{
    int t=belong[a];
    int temp[26],j=0;
    for(int i=seq[t].size()-1;seq[t][i]!=a;i--)
    {
        temp[j++]=seq[t][i];
        seq[t].pop_back();
    }
    temp[j]=a;
    seq[t].pop_back();

    t=belong[b];
    for(;j>=0;j--)
    {
        belong[temp[j]]=t;
        seq[t].push_back(temp[j]);
    }
}

int main()
{
    char oper[8],type[8];
    int a,b;
    scanf("%d",&n);
    for(int i=0;i<n;i++) belong[i]=i;
    for(int i=0;i<n;i++)
    {
        seq[i].clear();
        seq[i].push_back(i);
    }


    while(scanf("%s",oper) && oper[0]!='q')
    {
        scanf("%d %s %d",&a,type,&b);
        if(a==b || belong[a]==belong[b]) continue;
        if(oper[0]=='m')
            if(type[1]=='n')
            {
                ret_place(a);
                ret_place(b);
            }
            else ret_place(a);
        else if(type[1]=='n') ret_place(b);

        pileto(a,b);
    }

    for(int i=0;i<n;i++)
    {
        printf("%d:",i);
        for(int j=0;j<seq[i].size();j++) printf(" %d",seq[i][j]);
        printf("\n");
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值