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
),肯定不是触发的,做一个标记即可判断,详见代码。
至此为止就可以通过这题了。
代码#
说实话大模拟的代码作用不大,但也可以看看我的实现方法,自认为代码比较短。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】