poj 2632 Crashing Robots——模拟
这个题快把我搞吐了……有很多细节没有注意……
1.题目给的坐标不是我们平时用的向下增长的
2.处理字符的时候忘记用字符串读入
3.没有注意只要发现一组crash,就打出来,以后的不用管了
4.在敲程序的时候只要发现了一组crash,就直接从这组测试数据里面跳出来,没有注意后面还要读入数据,以免影响下一组测试数据
5.在机器人开始动以后不管它是否发生crash,都要把它原来的位置置零
6.在机器人没有发生crash的时候,就要把它的新位置在map上标明
7.先开始处理边界的时候居然写成<0了,晕……
8.忘记删文件导致RE…………?!(记得原来只有WA或者TLE,没想到还有RE……)
上代码:
a27400 | 2632 | Accepted | 444K | 0MS | G++ | 1702B | 2011-08-15 20:32:39 |
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
struct rob
{
int x,y;
int dir;
}robot[110];
int map[110][110];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int check(char c)
{
if(c=='N')
return 0;
else if(c=='E')
return 1;
else if(c=='S')
return 2;
else if(c=='W')
return 3;
}
int main(void)
{
int T;
scanf("%d",&T);
while(T--)
{
memset(map,0,sizeof(map));
memset(robot,0,sizeof(robot));
int n,m;
scanf("%d %d",&m,&n);
int num,order;
scanf("%d %d",&num,&order);
int i;
for(i=1;i<=num;i++)
{
int a,b;
char c[2];
scanf("%d %d %s",&a,&b,c);
int cc=check(c[0]);
map[b][a]=i;
robot[i].y=a;
robot[i].x=b;
robot[i].dir=cc;
}
int flag=1;
for(i=1;i<=order;i++)
{
int a,b;
char c[2];
scanf("%d %s %d",&a,c,&b);
if(flag)
{
if(c[0]=='L')
robot[a].dir=(robot[a].dir%4-b%4+4)%4;
else if(c[0]=='R')
robot[a].dir=(robot[a].dir%4+b%4)%4;
else if(c[0]=='F')
{
int u=robot[a].x;
int v=robot[a].y;
map[u][v]=0;
int temp=robot[a].dir;
for(int j=1;j<=b;j++)
{
u+=dir[temp][0];
v+=dir[temp][1];
if(v<=0||u<=0||u>n||v>m)
{
if(flag)
printf("Robot %d crashes into the wall\n",a);
flag=0;
break;
}
else if(map[u][v])
{
if(flag)
printf("Robot %d crashes into robot %d\n",a,map[u][v]);
flag=0;
break;
}
}
if(flag)
{
robot[a].x=u;
robot[a].y=v;
map[u][v]=a;
}
}
}
}
if(flag)
puts("OK");
}
}