ural 1101(Robot in the Field )表达式求值

本文介绍了一道关于机器人路径模拟的问题,通过布尔表达式判断机器人在遇到拐弯点时的转向,并考虑了寄存器指令翻转的情况。文章分享了解题思路及C++实现代码。

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

题目链接:点击打开链接

很水的模拟题,英语水平不行~~刚开始题目里面的invert没看懂,然后一直WA~~~OrzOrzOrzOrz

题目给定一个[-N-N]*[-N*N]的场地,题目中有一些拐弯点,根据boolean表达式的值判断向右转还是向左转~

还有一些点,能使机器人的某个寄存器指令翻转(就是这里题意读错了,Orz),刚开始机器人的全部指令为空,第一次遇到某个指令时候对应的寄存器打开,第二次再遇到相同指令的时候寄存器关闭,第三次又是打开~~~就是每次遇到一个指令,对应寄存器取反的意思~~~

来自大佬的debug数据:点击打开链接

废话不多说了,附上代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
using namespace std;
bool invert[30];
const int L[]={1,0,-1,0};
const int R[]={0,1,0,-1};
//下右上左
const int turn[4][2]={3,1,0,2,1,3,2,0};
//翻转~~~~~
const int N=220;
bool fork[N][N];
char cmd[N][N];
struct Point
{
    int x,y;
    Point(int _x=0,int _y=0) {x=_x;y=_y;}
};
int n,m,k;
string exp;
string replacesub(string exp,int s,int ls,string sub)
{
    return exp.substr(0,s)+sub+exp.substr(s+ls,exp.size()-s-ls);
}
bool booleanexp(string exp)
{
    for(int i=0;i<exp.size();i++)
    {
        if(exp[i]=='(')
        {
            int bsz=1;
            int ls=1;
            while(bsz)
            {
                if(exp[i+ls]=='(') bsz++;
                else if(exp[i+ls]==')') bsz--;
                ls++;
            }
            string subexp=exp.substr(i+1,ls-2);
            exp=replacesub(exp,i,ls,booleanexp(subexp)?"1":"0");
        }
    }
    for(int i=exp.size()-1;i>=0;i--)
        if(exp[i]=='!')
            exp=replacesub(exp,i,2,exp[i+1]=='1'?"0":"1");
    for(int i=0;i<exp.size();i++)
        if(exp[i]=='&')
            exp=replacesub(exp,i-1,3,(exp[i-1]=='1'&&exp[i+1]=='1')?"1":"0"),i--;
    for(int i=0;i<exp.size();i++)
        if(exp[i]=='|')
        {
            exp=replacesub(exp,i-1,3,(exp[i-1]=='1'||exp[i+1]=='1')?"1":"0"),i--;
        }
    return exp=="1";
}
inline bool bigalpha(char r)
{
    return r>='A'&&r<='Z';
}
bool process()
{
    char _exp[11000];
    string check;
    int Ls=0;
    _exp[Ls++]='$';
    for(int i=0;i<exp.size();i++) _exp[Ls++]=exp[i];
    _exp[Ls]='\0';
    for(int i=1;_exp[i];i++)
        if(bigalpha(_exp[i])&&!bigalpha(_exp[i-1])&&!bigalpha(_exp[i+1]))
        {
            if(invert[_exp[i]-'A']) _exp[i]='1';
            else _exp[i]='0';
        }
    for(int i=1;_exp[i];i++)
    {
        if(_exp[i]==' ') continue;
        else if(_exp[i]=='T'&&_exp[i+1]=='R'&&_exp[i+2]=='U'&&_exp[i+3]=='E') check+='1',i+=3;
        else if(_exp[i]=='F'&&_exp[i+1]=='A'&&_exp[i+2]=='L'&&_exp[i+3]=='S'&&_exp[i+4]=='E') check+='0',i+=4;
        else if(_exp[i]=='N'&&_exp[i+1]=='O'&&_exp[i+2]=='T') check+='!',i+=2;
        else if(_exp[i]=='O'&&_exp[i+1]=='R') check+='|',i+=1;
        else if(_exp[i]=='A'&&_exp[i+1]=='N'&&_exp[i+2]=='D') check+='&',i+=2;
        else check+=_exp[i];
    }
    //cout<<"check : "<<check<<endl;
    return booleanexp(check);
}
int main()
{
    while(getline(cin,exp))
    {
        cin>>n>>m>>k;
        memset(fork,false,sizeof(fork));
        memset(cmd,0,sizeof(cmd));
        memset(invert,false,sizeof(invert));
        for(int i=0;i<m;i++)
        {
            int x,y;
            cin>>x>>y;
            fork[x+n][y+n]=true;
        }
        for(int i=0;i<k;i++)
        {
            char sn;
            int x,y;
            cin>>x>>y>>sn;
            cmd[x+n][y+n]=sn;
        }
        vector<Point> path;
        int sn=0;
        Point cur(0,0);
        while(true)
        {
            path.push_back(cur);
            int x=cur.x+L[sn],y=cur.y+R[sn];
            cur.x=x,cur.y=y;
            if(cmd[x+n][y+n])
            {
                int sn=cmd[x+n][y+n]-'A';
                invert[sn]^=1;
            }
            if(x>n||x<-n||y>n||y<-n) break;
            if(fork[x+n][y+n])
            {
                if(process()) sn=turn[sn][0];
                else sn=turn[sn][1];
            }
        }
        int sz=path.size();
        for(int i=0;i<sz;i++) printf("%d %d\n",path[i].x,path[i].y);
        fflush(stdin);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值