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");
}
}

  

你可能感兴趣的:(Crash)