题目链接:http://poj.org/problem?id=2632
思路:本题就是单纯的模拟吧。。。
一直WAWA了好久好久。。。后来找了discuss里的一大堆数据来测!!感觉很不应该错!!!!模拟题的能力还有非常大的提升空间。。。
思路:就是用数组记录每个位置上有哪个机器人,以及记录机器人在哪个位置上,然后模拟。。
感悟:模拟题一定要小心小心仔细仔细·····
第一次wa发现没有考虑到又撞墙又撞到人的情况
第二次发现往右转和往左转写混了····右转漏了
第三次发现有一个dir[num] 打成num 了····,,还有什么位置没有更新之类的
觉得这类题目WA了以后应该更加静心下来仔细检查···而不是一直慌张导致很多小错误找不出来··· 不能太过于浮躁了。。要尽力做到考虑周全以及敲代码的时候不遗漏。。这次就有想的时候想到了然后打的时候忘记的情况。。orz
代码:
#include<cstdio>
#include<cstring>
#define Max 100000
int id[105][105];
int dir[110];
int s[110];
int x,y;
int ob(int p,int q,int m,int time)
{
int i;
if(m==1)
{
for(i=p+1;i<=p+time;i++)
if(id[i][q]!=0) return id[i][q];
}
else if(m==2)
{
for(i=q+1;i<=q+time;i++)
if(id[p][i]!=0) return id[p][i];
}
else if(m==3)
{
for(i=p-1;i>=p-time;i--)
if(id[i][q]!=0) return id[i][q];
}
else if(m==4)
{
for(i=q-1;i>=q-time;i--)
if(id[p][i]!=0) return id[p][i];
}
return 0;
}
int go(int num,char ch,int time)
{
int p = s[num] / Max;
int q = s[num] % Max;
if(ch == 'L')
dir[num] = (dir[num]+time%4)%4==0 ? 4 :(dir[num]+time%4)%4 ;
else if(ch == 'R')
dir[num] = (dir[num]-time%4)>0 ? dir[num]-time%4:4-(dir[num]-time%4);
else
{
int temp=0;
id[p][q]=0;
if(dir[num]==1)
{
temp=ob(p,q,dir[num],time);
if(p+time>x&&!temp) return 101;
else if(!temp)
{
id[p+time][q]=num;
s[num]=(p+time)*Max+q;
}
else return temp;
}
else if(dir[num]==2)
{
temp=ob(p,q,dir[num],time);
if(q+time>y&&!temp) return 101;
else if(!temp)
{
id[p][q+time]=num;
s[num]=p*Max+q+time;
}
else return temp;
}
else if(dir[num]==3)
{
temp=ob(p,q,dir[num],time);
if(p-time<1&&!temp) return 101;
else if(!temp)
{
id[p-time][q]=num;
s[num]=(p-time)*Max+q;
}
else return temp;
}
else if(dir[num]==4)
{
temp=ob(p,q,dir[num],time);
if(q-time<1&!temp) return 101;
else if(!temp)
{
id[p][q-time]=num;
s[num]=p*Max+q-time;
}
else return temp;
}
}
return 0;
}
int trans (char ch)
{
if(ch == 'E') return 1;
if(ch == 'N') return 2;
if(ch == 'W') return 3;
if(ch == 'S') return 4;
}
int main ()
{
int t;
//FILE* fp=fopen("input.txt","r");
//FILE* fp2=fopen("output.txt","a");
scanf("%d",&t);
while(t--)
{
int flag=0;
memset(id,0,sizeof(id));
memset(dir,0,sizeof(dir));
scanf("%d%d",&x,&y);
int n,m,i;
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i++)
{
int p,q;
char ch;
scanf("%d %d %c",&p,&q,&ch);
id[p][q] = i; //记录每个位置上有哪个机器人
s[i] = p*Max + q; //记录下每个机器人的位置
dir[i] = trans(ch);
}
for(i = 1;i <= m;i++)
{
int nn,time;
char move;
scanf("%d %c %d",&nn,&move,&time);
if(flag) continue;
int temp=go(nn,move,time);
if(temp)
{
if(temp==101)
{
printf("Robot %d crashes into the wall\n",nn);
flag=1;
}
else
{
flag=1;
printf("Robot %d crashes into robot %d\n",nn,temp);
}
}
}
if(i==m+1&&!flag) printf("OK\n");
}
//fclose(fp);
//fclose(fp2);
return 0;
}
又看到同学用结构体存储位置和方向。。感觉也是很不错的,我用的是之前在小紫书上看到的将位置化为数值记录下来。。感觉没有结构体方便。。下次记得用结构体。。
附上同学代码:
#include <iostream>
#include <cstring>
using namespace std;
int whouse[105][105],A,B;
struct robot
{
int x,y,fangxiang;
}r[101];
int move_E(int ra,int step)
{
int x1=r[ra].x,y1=r[ra].y;
whouse[x1][y1]=0;
if(r[ra].fangxiang==0)
{
for(int i=1;i<=step;i++)
{
if(y1+step>B)
{
cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
return 0;
}
if(whouse[x1][y1+i]!=0)
{
cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1][y1+i]<<endl;
return 0;
}
}
whouse[x1][y1+step]=ra;
r[ra].y=y1+step;
}
else if(r[ra].fangxiang==1)
{
for(int i=1;i<=step;i++)
{
if(x1-step<=0)
{
cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
return 0;
}
if(whouse[x1-i][y1]!=0)
{
cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1-i][y1]<<endl;
return 0;
}
}
whouse[x1-step][y1]=ra;
r[ra].x=x1-step;
}
else if(r[ra].fangxiang==2)
{
for(int i=1;i<=step;i++)
{
if(y1-i<=0)
{
cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
return 0;
}
if(whouse[x1][y1-i]!=0)
{
cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1][y1-i]<<endl;
return 0;
}
}
whouse[x1][y1-step]=ra;
r[ra].y=y1-step;
}
else
{
for(int i=1;i<=step;i++)
{
if(x1+i>A)
{
cout<<"Robot "<<ra<<" crashes into the wall"<<endl;
return 0;
}
if(whouse[x1+i][y1]!=0)
{
cout<<"Robot "<<ra<<" crashes into robot "<<whouse[x1+i][y1]<<endl;
return 0;
}
}
whouse[x1+step][y1]=ra;
r[ra].x=x1+step;
}
return 1;
}
int main(void)
{
int K;
cin>>K;
while(K--)
{
int N,M,ok=1;
cin>>A>>B>>N>>M;
memset(whouse,0,sizeof(whouse));
for(int i=1;i<=N;i++)
{
char ch;
cin>>r[i].x>>r[i].y>>ch;
if(ch=='N') r[i].fangxiang=0;
else if(ch=='W') r[i].fangxiang=1;
else if(ch=='S') r[i].fangxiang=2;
else r[i].fangxiang=3;
whouse[r[i].x][r[i].y]=i;
}
while(M--)
{
int ra,step;
char order;
cin>>ra>>order>>step;
if(!ok) continue;
if(order=='L') r[ra].fangxiang=(r[ra].fangxiang+step)%4;
else if(order=='R') r[ra].fangxiang=(r[ra].fangxiang+4-step%4)%4;
else ok=move_E(ra,step);
}
if(ok) cout<<"OK"<<endl;
}
return 0;
}