UVa-101 The Blocks Problem

#include <iostream>
#include <string>
#include <cstdio>
#include <vector>

using namespace std;

const int maxn = 25 + 5;
vector<int> block[maxn];
string str1, str2;
int pile_a, height_a, pile_b, height_b;     //a的堆序号 a所在的高度 b的堆序号 b所在的高度
int a, b;
int n;

inline void find_block(int temp, int& pile, int& height)            //找到木块a、b所在的堆序号pile和高度height,以引用的形式返回调用者
{
    for(pile = 0; pile < n; pile ++)
        for(height = 0; height < (int)block[pile].size(); height ++)
            if(block[pile][height] == temp)
                return;
}

inline void clear_above(int pile, int height)                       //把第pile堆高度为height的木块上方所有的木块移回原位
{
    for(int i = height + 1; i < (int)block[pile].size(); i ++)
    {
        int temp = block[pile][i];
        block[temp].push_back(temp);        //把木块temp放回原位
    }
    block[pile].resize(height + 1);         //block只应保留下标0~height的元素
}

inline void pile_onto(int pile1, int height, int pile2)             //把第pile1堆高度为height及其上方的木块整体移动到pile2堆的顶部
{
    for(int i = height; i < (int)block[pile1].size(); i ++)
        block[pile2].push_back(block[pile1][i]);
    block[pile1].resize(height);
}

inline void print()                         //格式输出
{
    for(int i = 0; i < n; i ++)
    {
        printf("%d:", i);
        for(int j = 0; j < (int)block[i].size(); j ++)
            printf(" %d", block[i][j]);
        printf("\n");
    }
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i ++)
        block[i].push_back(i);              //初始vector
    while(cin >> str1)
    {
        if(str1 == "quit")
            break;
        cin >> a >> str2 >> b;
        find_block(a, pile_a, height_a);    //找到a的位置
        find_block(b, pile_b, height_b);    //找到b的位置
        if(pile_a == pile_b)                //非法指令 忽略
            continue;
        if(str1 == "move" && str2 == "onto")        //move a onto b
        {
            clear_above(pile_a, height_a);
            clear_above(pile_b, height_b);
            pile_onto(pile_a, height_a, pile_b);
        }
        else if(str1 == "move" && str2 == "over")   //move a over b
        {
            clear_above(pile_a, height_a);
            pile_onto(pile_a, height_a, pile_b);
        }
        else if(str1 == "pile" && str2 == "onto")   //pile a onto b
        {
            clear_above(pile_b, height_b);
            pile_onto(pile_a, height_a, pile_b);
        }
        else if(str1 == "pile" && str2 == "over")   //pile a over b
            pile_onto(pile_a, height_a, pile_b);
//        上述步骤(容易理解)可发现步骤规律 可简化如下:
//        if(str1 == "move")
//            clear_above(pile_a, height_a);
//        if(str2 == "onto")
//            clear_above(pile_b, height_b);
//        pile_onto(pile_a, height_a, pile_b);
    }
    print();            //最后输出
    return 0;
}
题意:从左到右有n个木块,编号0~n-1,要求模拟以下4种操作(下面a和b都是木块的操作)。
 
move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面。
move a over b: 把a上方的木块全部归位,然后把a放在b所在木块堆得顶部。
pile a onto b: 把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。
pile a over b:把a及上面的木块整体摞在b所在木块的顶部。
所有操作结束后,输出每个位置的木块列表,按照从底部到顶部的顺序排列。
题解:用vector<int> block[maxn]做核心。具体算法竞赛入门经典。一开始find_block函数两个for循环用的pile和height又在前面用int定义了(for(int pile = 0; pile < n; pile ++)) 导致错误。 string用空格和回车都表示结束。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51232是一种Raspberry Pi开发板型号,它可以与Simulink驱动程序块一起使用。Simulink是一种用于模拟、建模和代码生成的工具,而Raspberry Pi是一种可以运行Simulink模型的单板计算机。 Simulink驱动程序块是用于将Raspberry Pi的功能与Simulink模型集成的工具。它允许用户通过Simulink模型来控制和读取Raspberry Pi上的各种传感器和执行器。用户可以通过简单地将各种驱动程序块添加到Simulink模型中来实现与Raspberry Pi的通信和控制。 ADC表示模拟转数字转换器,DAC表示数字转模拟转换器,PWM表示脉冲宽度调制。Raspberry Pi上的ADC和DAC驱动程序块可以实现数据的模拟输入和输出。用户可以将传感器的模拟信号通过ADC转换为数字信号,并在Simulink模型中进行处理。类似地,用户可以使用DAC将模拟输出信号从Simulink模型发送到执行器。 PWM驱动程序块可以通过产生脉冲宽度调制信号来控制Raspberry Pi上的PWM输出引脚。PWM信号可以用于控制各种执行器,如电机和舵机。用户可以在Simulink模型中调整PWM信号的参数,并通过Raspberry Pi的PWM引脚将其输出。 总而言之,51232 Raspberry Pi Simulink驱动程序块可以实现与Simulink模型的综合,通过ADC和DAC驱动程序块进行模拟输入和输出,通过PWM驱动程序块控制PWM输出。这使得用户能够利用Simulink的功能来控制和监测Raspberry Pi上的各种设备和传感器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值