第一次写这么长的模拟题把,思路很简单,但是两天才完全搞定,我是跟着思路一步一步来的,这次的坑点主要在
if else 语句上的失败,
举个例子
if(ok1)
if(ok2)
else
{
}
我原本的意思是想要分三种情况,而上述代码却执行了两种情况,找了半天才找出来。
还有一个也是 if 语句,举个例子
if(dir=='n')
{
somefunction()...
}
if(dir=='e')
{
...
}
也不能用if,而要用else if
因为可能第一个操作导致dir变成了e,而又执行下一个操作。
注意到这点其他的没什么可说的了,按步骤赖就行。当然我的代码还没优化,可以自己优化。
#include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; int num; int n,m; int p,c,flag,step; int vis[110][110]; struct Node { int x; int y; char dir; } node; map<int,Node>mp; void solve() { int tx=node.x; int ty=node.y; char dir=node.dir; int cnt=1; int nx=tx,ny=ty; //cout<<dir<<" "<<tx<<" "<<ty<<endl; if(dir=='W') { for(int i=tx-1; i>=1&&cnt<=step; --i,++cnt) { if(vis[i][ty]) { cout<<"Robot "<<num<<" crashes into robot "<<vis[i][ty]<<endl; flag=1; break; } } if(!flag&&tx-step<1) { cout<<"Robot "<<num<<" crashes into the wall"<<endl; flag=1; } if(!flag) { nx=tx-step; } } else if(dir=='N') { for(int i=ty+1; i<=m&&cnt<=step; ++i,++cnt) { if(vis[tx][i]) { cout<<"Robot "<<num<<" crashes into robot "<<vis[tx][i]<<endl; flag=1; break; } } if(!flag&&ty+step>m) { cout<<"Robot "<<num<<" crashes into the wall"<<endl; flag=1; } if(!flag) { ny=ty+step; } } else if(dir=='E') { for(int i=tx+1; i<=n&&cnt<=step; ++i,++cnt) { if(vis[i][ty]) { cout<<"Robot "<<num<<" crashes into robot "<<vis[i][ty]<<endl; flag=1; break; } } if(!flag&&tx+step>n) { cout<<"Robot "<<num<<" crashes into the wall"<<endl; flag=1; } if(!flag) { nx=tx+step; } } else if(dir=='S') { //cout<<tx<<" "<<ty<<endl; for(int i=ty-1; i>=1&&cnt<=step; --i,++cnt) { if(vis[tx][i]) { cout<<"Robot "<<num<<" crashes into robot "<<vis[tx][i]<<endl; flag=1; break; } } if(!flag&&ty-step<1) { cout<<"Robot "<<num<<" crashes into the wall"<<endl; flag=1; } if(!flag) { ny=ty-step; } } if(!flag) { vis[tx][ty]=0; vis[nx][ny]=num; node.x=nx; node.y=ny; node.dir=dir; mp[num]=node; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); memset(vis,0,sizeof(vis)); flag=0; cin>>p>>c; int x,y; char d; for(int i=1; i<=p; ++i) { scanf("%d %d %c",&x,&y,&d); vis[x][y]=i; node.x=x; node.y=y; node.dir=d; mp[i]=node; } for(int i=1; i<=c; ++i) { scanf("%d %c %d",&num,&d,&step); if(!flag) { if(d=='L') { step%=4; if(step) { if(mp[num].dir=='W') { if(step==1) { mp[num].dir='S'; } if(step==2) { mp[num].dir='E'; } if(step==3) { mp[num].dir='N'; } } else if(mp[num].dir=='N') { if(step==1) { mp[num].dir='W'; } if(step==2) { mp[num].dir='S'; } if(step==3) { mp[num].dir='E'; } } else if(mp[num].dir=='S') { if(step==1) { mp[num].dir='E'; } if(step==2) { mp[num].dir='N'; } if(step==3) { mp[num].dir='W'; } } else if(mp[num].dir=='E') { if(step==1) { mp[num].dir='N'; } if(step==2) { mp[num].dir='W'; } if(step==3) { mp[num].dir='S'; } } } } else if(d=='R') { step%=4; if(step) { if(mp[num].dir=='W') { if(step==1) { mp[num].dir='N'; } if(step==2) { mp[num].dir='E'; } if(step==3) { mp[num].dir='S'; } } else if(mp[num].dir=='N') { if(step==1) { mp[num].dir='E'; } if(step==2) { mp[num].dir='S'; } if(step==3) { mp[num].dir='W'; } } else if(mp[num].dir=='S') { if(step==1) { mp[num].dir='W'; } if(step==2) { mp[num].dir='N'; } if(step==3) { mp[num].dir='E'; } } else if(mp[num].dir=='E') { if(step==1) { mp[num].dir='S'; } if(step==2) { mp[num].dir='W'; } if(step==3) { mp[num].dir='N'; } } } } else { node=mp[num]; solve(); } } } if(!flag) cout<<"OK"<<endl; } }