题目链接:点击打开链接
很水的模拟题,英语水平不行~~刚开始题目里面的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;
}