P9966 [THUPC 2024 初赛] 机器人 题解

细节大模拟。

题意#

一堆机器人在一起,每个人有左右手和一些指令,依次执行并输出结果。

做法#

首先这种指令的执行还算是比较简单的大模拟,一个个实现即可,在此给出我的定义。

struct Robot{
    int l_hand,r_hand,lst[15];
}bot[105];
struct Order{
    string name;
    int h,x,y,z,id;
    string cmdname;//trigger 触发条件
    Order(){name=cmdname="";h=x=y=z=id=0;}
};
vector<Order> U;//所有命令

我将所有的命令统一存放在一起,便于后期使用。

然后讲讲读入问题,因为可能存在超长的嵌套,所以采用递归的形式进行读入。

Order Analyze(){
    Order res; string s,cmd,cname; cin>>s;
    int H,X,Y,Z; res.name=s;
    if(s[1]=='O') cin>>H>>Z,res.h=H,res.z=Z;
    else if(s[1]=='W') cin>>H>>X>>Y,res.h=H,res.x=X,res.y=Y;
    else if(s[1]=='I') cin>>H>>X,res.h=H,res.x=X;
    else if(s[1]=='C') cin>>H,res.h=H;
    else if(s[1]=='E') {
        cin>>H>>X,res.h=H,res.x=X;
        Order cmd=Analyze(); U.push_back(cmd);
        res.id=int(U.size())-1;
    }else if(s[1]=='R'){
        cin>>cname;cname.pop_back();res.cmdname=cname;
        Order cmd=Analyze();U.push_back(cmd);
        res.id=int(U.size())-1;
    }
    return res;
}

另外,在这里你可能关注到了我的判断方式,这种写法考场不容易写错,也能减小常数,因为 string 的比较还是很费时的,当然在这题命令不长也无所谓。

之后就是具体实现每个操作了,因为其他操作都很简单,在这里就解释部分坑点,难点。

MIRROR 操作#

对于不是 TRIGGER 的操作还是简单的直接取反即可,但是对 TRIGGER 的操作,因为要考虑到一个指令不一定只有一个人在用,所以不能直接对原指令搞,而要另外拷贝一个。

REPLACE 操作#

其实和 MIRROR 一样,使用拷贝即可。

TRIGGER 操作#

其实说的是怎么判断一个操作是不是被触发而来的。

首先,你自己调用的(或 ACTIVATE),肯定不是触发的,做一个标记即可判断,详见代码。

至此为止就可以通过这题了。

代码#

说实话大模拟的代码作用不大,但也可以看看我的实现方法,自认为代码比较短。

code.

作者:紊莫

出处:https://www.cnblogs.com/wenmoor/p/17980938

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   紊莫  阅读(177)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu