//11174234 c00h00g 2632 Accepted 452K 32MS G++ 6938B 2013-01-13 22:30:37
//题意,只需要按照给定的操作进行移动,出现碰撞要推出
//WA1次,原因:需要返回的是第一次碰撞的结果,如果某条路径上可能出现多个碰撞,输出第一个就可以了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fstream>
using namespace std;
//存储节点的编号,表示在某个位置上的机器人的编号
int mat[105][105];
//规定E:1,N:2,W:3,S:0
struct Node{
int x,y,direction;
};
Node robot[105];
int k,n,m,a,b;
char ch;
int main(){
scanf("%d",&k);
while(k--){
memset(mat,0,sizeof(mat));
scanf("%d%d",&a,&b);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&robot[i].x,&robot[i].y);
mat[robot[i].x][robot[i].y]=i;
getchar();
scanf("%c",&ch);
if(ch=='E') robot[i].direction=1;
if(ch=='N') robot[i].direction=2;
if(ch=='W') robot[i].direction=3;
if(ch=='S') robot[i].direction=0;
}
//处理每一个,查看是否有crash,如果有的话则跳出
int id,step,from,to;
char ope;
bool flag=false;
for(int i=1;i<=m;i++){
scanf("%d",&id); getchar();
scanf("%c",&ope);
scanf("%d",&step);
if(flag==true)
continue;
from=id,to=0;
if(ope=='F'){
//判断每一个的方向
if(robot[id].direction==1){
//范围如果超过a的话
if(robot[id].x+step>a){
//查看之间是否有其他robot
for(int j=robot[id].x+1;j<=a;j++){
if(mat[j][robot[id].y]!=0){
flag=true;
to=mat[j][robot[id].y];
break;//这个地方要添加break,保证是第一次
}
}//end for
//如果没有其他robot,说明超过范围
if(flag==false){
flag=true;
//break 错在这个地方了,跳出之后剩下的测试样例就不能读了,处理方法是如果flag==true的话,continue
}
}//end if
else{
for(int j=robot[id].x+1;j<=robot[id].x+step;j++){
if(mat[j][robot[id].y]!=0){
flag=true;
to=mat[j][robot[id].y];
break;
}
}
if(flag==false){
mat[robot[id].x][robot[id].y]=0;
robot[id].x=robot[id].x+step;
mat[robot[id].x][robot[id].y]=id;
}
}//end else
}
if(robot[id].direction==3){
if(robot[id].x-step<=0){
for(int j=robot[id].x-1;j>0;j--){
if(mat[j][robot[id].y]!=0){
flag=true;
to=mat[j][robot[id].y];
break;
}
}
if(flag==false){
flag=true;
}
}
else{
for(int j=robot[id].x-1;j>=robot[id].x-step;j--){
if(mat[j][robot[id].y]!=0){
flag=true;
to=mat[j][robot[id].y];
break;
}
}
if(flag==false){
mat[robot[id].x][robot[id].y]=0;
robot[id].x=robot[id].x-step;
mat[robot[id].x][robot[id].y]=id;
}
}//end else
}
if(robot[id].direction==2){
if(robot[id].y+step>b){
for(int j=robot[id].y+1;j<=b;j++){
if(mat[robot[id].x][j]!=0){
flag=true;
to=mat[robot[id].x][j];
break;
}
}
if(flag==false){
flag=true;
}
}
else{
for(int j=robot[id].y+1;j<=robot[id].y+step;j++){
if(mat[robot[id].x][j]!=0){
flag=true;
to=mat[robot[id].x][j];
break;
}
}
if(flag==false){
mat[robot[id].x][robot[id].y]=0;
robot[id].y=robot[id].y+step;
mat[robot[id].x][robot[id].y]=id;
}
}//end else
}
if(robot[id].direction==0){
if(robot[id].y-step<=0){
for(int j=robot[id].y-1;j>0;j--){
if(mat[robot[id].x][j]!=0){
flag=true;
to=mat[robot[id].x][j];
break;
}
}
if(flag==false){
flag=true;
}
}
else{
for(int j=robot[id].y-1;j>=robot[id].y-step;j--){
if(mat[robot[id].x][j]!=0){
flag=true;
to=mat[robot[id].x][j];
break;
}
}
if(flag==false){
mat[robot[id].x][robot[id].y]=0;
robot[id].y=robot[id].y-step;
mat[robot[id].x][robot[id].y]=id;
}
}//end else
}
}//end m
if(ope=='L')
robot[id].direction=(robot[id].direction+step)%4;
if(ope=='R')
robot[id].direction=(robot[id].direction+4-step%4)%4;
}
if(flag==false){
printf("OK\n");
}
else{
if(to==0)
printf("Robot %d crashes into the wall\n",from);
else
printf("Robot %d crashes into robot %d\n",from,to);
}
}//while k--
return 0;
}
POJ 2632 模拟
最新推荐文章于 2022-02-21 12:56:26 发布