有一些机器人在屋子里行走,他们要在不相互碰撞的情况下完成指令,地图是矩形的,每个机器人占据一个格子的位置,我们知道机 器人的初始位置和方向,以及一系列命令,命令是有序的,不会有两个命令是同时发生的。如下图:
多组数据,第一行为数据的组数k
每组数据以两个整数n,m开始,表示地图的尺寸,n为W-E走向的尺寸,m为N-S走向的尺寸 (n,m<=100)
接下来一行为两个整数为p,q (p,q<=100) , 表示p个机器人,q个命令
接下来p行描述机器人的初始信息,位置(x,y)
(1<=x<=n,1<=y<=m) ,和一个字母表示机器人初始面对的方向('N','S','E','W')接下来q行描述指令,指令构成如下
<robot i><action><repeat>表示机器人,动作种类,重复次数
action种类有3种
重复次数不会大于100。
机器人一旦发生碰撞,则停止运行,并输出相关的错误信息。
有3种:
如果第i个机器人(x=0或者y=0或者x=n+1或者y=m+1),输出 Robot i crashes into the wall
如果i和j相撞,i是移动的那个机器人,输出 Robot i crashes into robot j
如果没有碰撞发生,输出 OK
Robot 1 crashes into the wall
OK
解题思路:
此题是一道模拟题,只要按照题目述说的意思来做应该就能做的出来。
我用了两个结构数组,一个结构数组用来存放机器人的位置和面对的方向,另一个结构数组用来标记地图大小以及地图每个格子内是否存在其他机器人。
当机器人移动时,首先判断是不是出界,再判断是不是撞到其他机器人。按照程序的输入样例进行处理即可。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct s { char f; int x; int y; }; struct pp { int up; int ss; }; main() { struct s robot[101]; struct pp a[102][102]; int number,te; int i,j; int n,m; int p,q; int tee; int x1,y1; char face; int num; char action; int repeat; int flag; scanf("%d",&number); for(te=1;te<=number;te++) { scanf("%d %d",&n,&m); for(i=0;i<102;i++) for(j=0;j<102;j++) { a[i][j].up=-1; a[i][j].ss=0; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) a[i][j].up=0; scanf("%d %d",&p,&q); for(tee=1;tee<=p;tee++) { scanf("%d %d %c",&x1,&y1,&face); robot[tee].f=face; robot[tee].x=x1; robot[tee].y=y1; a[m-y1+1][x1].up=1; a[m+1-y1][x1].ss=tee; } flag=0; for(tee=1;tee<=q;tee++) { scanf("%d %c %d",&num,&action,&repeat); if(action=='L') { repeat=repeat%4; if(repeat==1) { if(robot[num].f=='E') { robot[num].f='N'; goto ABC; } if(robot[num].f=='N') { robot[num].f='W'; goto ABC; } if(robot[num].f=='W') { robot[num].f='S'; goto ABC; } if(robot[num].f=='S') { robot[num].f='E'; goto ABC; } } if(repeat==2) { if(robot[num].f=='E') { robot[num].f='W'; goto ABC; } if(robot[num].f=='N') { robot[num].f='S'; goto ABC; } if(robot[num].f=='W') { robot[num].f='E'; goto ABC; } if(robot[num].f=='S') { robot[num].f='N'; goto ABC; } } if(repeat==3) { if(robot[num].f=='E') { robot[num].f='S'; goto ABC; } if(robot[num].f=='N') { robot[num].f='E'; goto ABC; } if(robot[num].f=='W') { robot[num].f='N'; goto ABC; } if(robot[num].f=='S') { robot[num].f='W'; goto ABC; } } } if(action=='R') { repeat=repeat%4; if(repeat==1) { if(robot[num].f=='E') { robot[num].f='S'; goto ABC; } if(robot[num].f=='N') { robot[num].f='E'; goto ABC; } if(robot[num].f=='W') { robot[num].f='N'; goto ABC; } if(robot[num].f=='S') { robot[num].f='W'; goto ABC; } } if(repeat==2) { if(robot[num].f=='E') { robot[num].f='W'; goto ABC; } if(robot[num].f=='N') { robot[num].f='S'; goto ABC; } if(robot[num].f=='W') { robot[num].f='E'; goto ABC; } if(robot[num].f=='S') { robot[num].f='N'; goto ABC; } } if(repeat==3) { if(robot[num].f=='E') { robot[num].f='N'; goto ABC; } if(robot[num].f=='N') { robot[num].f='W'; goto ABC; } if(robot[num].f=='W') { robot[num].f='S'; goto ABC; } if(robot[num].f=='S') { robot[num].f='E'; goto ABC; } } } if(action=='F') { if(robot[num].f=='E') { for(i=1;i<=repeat;i++) { a[m+1-robot[num].y][robot[num].x].up=0; a[m+1-robot[num].y][robot[num].x].ss=0; robot[num].x++; if( a[m+1-robot[num].y][robot[num].x].up==-1) { printf("Robot %d crashes into the wall\n",num); flag=1; goto ABC; } if( a[m+1-robot[num].y][robot[num].x].ss!=0) { printf("Robot %d crashes into robot %d\n",num, a[m+1-robot[num].y][robot[num].x].ss); flag=1; goto ABC; } a[m+1-robot[num].y][robot[num].x].up=1; a[m+1-robot[num].y][robot[num].x].ss=num; } } if(robot[num].f=='N') { for(i=1;i<=repeat;i++) { a[m+1-robot[num].y][robot[num].x].up=0; a[m+1-robot[num].y][robot[num].x].ss=0; robot[num].y++; if( a[m+1-robot[num].y][robot[num].x].up==-1) { printf("Robot %d crashes into the wall\n",num); flag=1; goto ABC; } if( a[m+1-robot[num].y][robot[num].x].ss!=0) { printf("Robot %d crashes into robot %d\n",num, a[m+1-robot[num].y][robot[num].x].ss); flag=1; goto ABC; } a[m+1-robot[num].y][robot[num].x].up=1; a[m+1-robot[num].y][robot[num].x].ss=num; } } if(robot[num].f=='W') { for(i=1;i<=repeat;i++) { a[m+1-robot[num].y][robot[num].x].up=0; a[m+1-robot[num].y][robot[num].x].ss=0; robot[num].x--; if( a[m+1-robot[num].y][robot[num].x].up==-1) { printf("Robot %d crashes into the wall\n",num); flag=1; goto ABC; } if( a[m+1-robot[num].y][robot[num].x].ss!=0) { printf("Robot %d crashes into robot %d\n",num, a[m+1-robot[num].y][robot[num].x].ss); flag=1; goto ABC; } a[m+1-robot[num].y][robot[num].x].up=1; a[m+1-robot[num].y][robot[num].x].ss=num; } } if(robot[num].f=='S') { for(i=1;i<=repeat;i++) { a[m+1-robot[num].y][robot[num].x].up=0; a[m+1-robot[num].y][robot[num].x].ss=0; robot[num].y--; if( a[m+1-robot[num].y][robot[num].x].up==-1) { printf("Robot %d crashes into the wall\n",num); flag=1; goto ABC; } if( a[m+1-robot[num].y][robot[num].x].ss!=0) { printf("Robot %d crashes into robot %d\n",num, a[m+1-robot[num].y][robot[num].x].ss); flag=1; goto ABC; } a[m+1-robot[num].y][robot[num].x].up=1; a[m+1-robot[num].y][robot[num].x].ss=num; } } } ABC: if(flag==1) break; else continue; } for(i=tee;i<q;i++) scanf("%d %c %d",&num,&action,&repeat); if(flag==0) printf("OK\n"); } }