首页 > 其他分享 >【UVA 101】The Blocks Problem 题解(模拟+向量)

【UVA 101】The Blocks Problem 题解(模拟+向量)

时间:2023-12-07 13:01:00浏览次数:34  
标签:xa Blocks xb 题解 over move 堆叠 UVA onto

计算机科学的许多领域使用简单、抽象的领域进行分析和实证研究。

例如,早期的人工智能规划和机器人研究(STRIPS)使用了一个区块世界,其中机器人 arm执行涉及块操作的任务。 在这个问题中,您将在某些规则和约束下对一个简单的块世界进行建模。相当地 与确定如何达到指定状态相比,您将“编程”机器人手臂以响应 有限的命令集。 问题是解析一系列命令,指导机器人手臂如何操作块 躺在一张平桌子上。最初,表上有n个块(编号从0到n−1),带有块 bi与区块bi+1相邻,所有0≤i<n−1,如下图所示:

【UVA 101】The Blocks Problem 题解(模拟+向量)_ci

【UVA 101】The Blocks Problem 题解(模拟+向量)初始块世界 操纵块的机械臂的有效命令如下: •move a onto b 其中a和b是块号,在返回以下任何块后,将块a放到块b上 堆叠在块a和b的顶部至其初始位置。 •move a over b 其中a和b是块号,将块a放在包含块b的堆栈的顶部,之后 将堆叠在块a顶部的任何块返回到其初始位置。 •pile a onto b 其中a和b是块号,移动由块a和任何块组成的块堆 将堆叠在a块上方的所有块移动到b块上 打桩前的初始位置。堆叠在a块上方的块保持其顺序 当移动时。 •pile a over b 其中a和b是块号,将由块a和任何块组成的一堆块放入 堆叠在区块a上方的区块,放置在包含区块b的堆叠顶部 上面的块a在移动时保持其原始顺序。 •quit 终止块世界中的操作。 任何a=b或a和b位于同一块堆栈中的命令都是非法的 命令应忽略所有非法命令,并且不应影响 阻碍。

输入 输入以一行上的整数n开始,该整数n本身表示块中的块数 世界您可以假设0<n<25。 块的数量后面跟着一系列块命令,每行一个命令。你的 程序应处理所有命令,直到遇到退出命令。 您可以假设所有命令都是上面指定的格式。语法上不会有 错误的命令。 输出 输出应包含块世界的最终状态。每个原始块位置编号 i(0≤i<n,其中n是块的数量)应紧跟冒号出现。如果有 至少是一个块,冒号后面必须跟一个空格,后面是出现的块列表 每个块号与其他块号隔开一个空格。不要 在一行中放置任何尾随空格。 每个块位置应有一行输出(即n行输出,其中n是 输入的第一行上的整数)。

Sample Input 10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit Sample Output 0: 0 1: 1 9 2 4 2: 3: 3 4: 5: 5 8 7 6 6: 7: 8: 9:

思路

用一个vector数组储存方块摆放位置。对方块操作前应该定位它在vector数组中的位置。执行move前要将a块和它上面的块归位,执行onto前要将b块和它上面的块归位。注意应忽略所有a=b或a和b位于同一块堆中的非法命令。

AC代码

#include <iostream>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;

int n;
vector<int> v[30];

void print()
{
    for (int i = 0; i < n; i++)
    {
        cout << i << ":";
        for (int j = 0; j < v[i].size(); j++)
        {
            cout << " " << v[i][j];
        }
        cout << endl;
    }
}

void find(int t, int *x, int *y)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < v[i].size(); j++)
        {
            if (t == v[i][j])
            {
                *x = i;
                *y = j;
                return;
            }
        }
    }
}

void reset(int x, int y)
{
    for (int i = y + 1; i < v[x].size(); i++)
    {
        int t = v[x][i];
        v[t].push_back(t);
    }
    v[x].resize(y + 1);
}

void move(int xa, int ya, int xb)
{
    for (int i = ya; i < v[xa].size(); i++)
    {
        int t = v[xa][i];
        v[xb].push_back(t);
    }
    v[xa].resize(ya);
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        v[i].push_back(i);
    }
    string cmd1, cmd2;
    int a, b;
    int xa, ya, xb, yb;
    while (cin >> cmd1)
    {
        if ("quit" == cmd1)
        {
            break;
        }
        cin >> a >> cmd2 >> b;
        find(a, &xa, &ya);
        find(b, &xb, &yb);
        if (xa == xb)
        {
            continue;
        }
        if ("move" == cmd1)
        {
            reset(xa, ya);
        }
        if ("onto" == cmd2)
        {
            reset(xb, yb);
        }
        move(xa, ya, xb);
    }
    print();
    return 0;
}

标签:xa,Blocks,xb,题解,over,move,堆叠,UVA,onto
From: https://blog.51cto.com/HEX9CF/8720912

相关文章

  • Maven无法下载fastdfs-client-java依赖问题解决
    一、分析原因控制台报错具体如下:并且pom.xml中以下依赖爆红:<dependency><groupId>org.csource</groupId><artifactId>fastdfs-client-java</artifactId><version>1.29-SNAPSHOT</version></dependency>原因:因为fastdfs-clien......
  • [CF83E] Two Subsequences 题解
    [CF83E]TwoSubsequences题解思路定义\(overlap(a,b)\)为字符串\(a\)的后缀与\(b\)的前缀的最大相等的长度,有\(|f(a,b)|=|a|+|b|-overlap(a,b)\),下文称匹配为相邻两串的\(overlap\)。观察到每次操作之后,一定有一个序列是以\(a_i\)为结尾的。所以根据这个......
  • CF1900B题解
    原题思路略微思考不难得到,三个数字的数量之差的奇偶性是不会变的。因为一个数的数量减少了$1$,另一个数无论是增加$1$或是减少$1$,两者的差要么不变,要么增加/减少$2$,对奇偶性无影响。同时,如果另外两个数的数量变为$0$,它们数目的差一定是$0$。那么,我们只需要判断另外两个......
  • 【题解】CodeForces 686E Optimal Point
    传送门:https://codeforces.com/contest/686/problem/E前言:本题解来源于作者某天晚上和一位朋友的发电内容(没错,这个作者直接把自己和朋友发电时发的话用markdown排了一下,传上来了),当时本来就比较口语化,加上作者的做法又实在太过离谱,因此可能语言表述不够清晰,对此深感抱歉qwq;离......
  • 【题解】LibreOJ #3051「十二省联考 2019」皮配
    传送门:https://loj.ac/p/3051  首先,对于这样“少部分个体有特殊要求”的题目,我们先考虑,如果没有任何个体有特殊要求怎么做,然后再考虑怎么加上特殊要求;对于这道题,如果$k=0$,即没有学校有不喜欢的导师,那么,设总人数为$al$,城市$i$的人数和为$cit_i$、选择的阵营为$zy_i=0/......
  • UVA753 A Plug for UNIX 题解
    LinkUVA753APlugforUNIXQuestion有\(n\)个插座,\(m\)个设备和\(k\)种转换器,每种转换器有无限多个。转换器可以插着转换器用,每个插座或插头的类型可能不同,求最少剩多少个不匹配的设备Sulotion先考虑转换器连用的情况,用边表\(G[x][y]\)表示\(x\)类型可以转换成\(y......
  • UVA1395 Slim Span 题解
    LinkUVA1395SlimSpanQuestion求所有生成树中最大边权与最小边权差最小的,输出他们的差值Solution因为\(n\le100\)非常小,先把边从小到大排序,那么生成树的边肯定是排序后上的边连续的一块所以,可以枚举连续一块的起点\(L\),\(R\)从\(L\)往后推,判断全图连通性,如果已经完......
  • CF1809D Binary String Sorting 题解
    题意:思路:贪心:单调不降的$01$字符串,一定是一串连续的$0$再加上一串连续的$1$。由于每次操作的代价很大,所以需要在操作次数尽可能少的情况下,尽可能多地使用交换操作。由于$1$次交换操作,只能减少$1$个逆序对,当存在多个逆序对时,优先通过删除操作减少逆序对的......
  • ucup hefei 题解
    比赛链接B很有意思的题首先题目的要求为可以拆分成\(2\)个不相交的不降子序列根据\(dilworth\)定理,最小链覆盖\(=\)最长反链,所以要求最长反链\(\le2\)即原序列的逆序列的最长不降子序列长度\(\le2\)不难得到一个\(dp\)做法为:令\(f_{i,j}\)为到数\(i\),最长上......
  • python HTML文件标题解析问题的挑战
    引言在网络爬虫中,HTML文件标题解析扮演着至关重要的角色。正确地解析HTML文件标题可以帮助爬虫准确地获取所需信息,但是在实际操作中,我们常常会面临一些挑战和问题。本文将探讨在Scrapy中解析HTML文件标题时可能遇到的问题,并提供解决方案。问题背景在解析HTML文件标题的过程中,......