Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7394 | Accepted: 3242 |
Description
Input
Output
Sample Input
4 5 4 2 2 1 1 E 5 4 W 1 F 7 2 F 7 5 4 2 4 1 1 E 5 4 W 1 F 3 2 F 1 1 L 1 1 F 3 5 4 2 2 1 1 E 5 4 W 1 L 96 1 F 2 5 4 2 3 1 1 E 5 4 W 1 F 4 1 L 1 1 F 20
Sample Output
Robot 1 crashes into the wall Robot 1 crashes into robot 2 OK Robot 1 crashes into robot 2
【题目来源】
http://poj.org/problem?id=2632
【题目大意】
poj 2632
在一个大型仓库里,机器人常常需要来往取货。需要一系列的指令来操作机器人使得每个机器人移动到他的目的地。并且不能撞到其他的机器人。当然,所有的仓库都是矩形的,每个的机器人占据一个半径为1的圆形。
假定有N个机器人,编号为1到N。你将会知道每个机器人的位置和方向,并且所有下达的指令,机器人将会听从这些指令。指令出来后将会被处理。
没有两个机器人将会同时移动,每个机器人移动完后下一个机器人才会移动。
一个机器人撞到墙壁的话,他将会被撞毁;如果两个机器人相撞的话,两个机器人都将会被撞毁。
输入:
第一行是一个整数K,表示测试情况有K个。
每个测试情况的第一行是两个整数,1<=A,B<=100,表示这个仓库的大小。A表示横向的长度,B表示纵向的长度。
第二行有两个数,1<=N,M<=100,分别表示机器人的数量和指令数目。
接下来有N行,每行有两个数字和一个字母(N,S,E,W),表示每一个机器人的坐标和方向。没有相同的两个机器人在相同的位置上。
最后是M行,代表一连串的指令。
每个指令的格式如下:
<哪个机器人><要执行的动作><重复的次数>
其中动作包括:
L:向左转90度
R:向右转90度
F:向前走
每次重复的次数大于等于1小于等于10。
输出:
每个test case输出1行。
输出包括:
如果机器人i撞到了墙壁,那么输出:Robot i crashes into the wall
如果机器人i撞到了机器人j,那么输出:Robot i crashes into robot j
如果没有机器人相撞,那么输出:OK
只需要报告第一次撞击。
【题目分析】
比较简单的长模拟,就是代码长,估计是被我写残了,写了250多行。做的时候要注意细节,比如说这题的地图的y轴和数组是反的,做的时候要反过来,还有横纵坐标也是反的。注意了这些细节就可以ac了。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define MAX 150 using namespace std; struct Node { bool have; int dir; int number; }; Node Map[MAX][MAX]; int A,B; struct Order { int num; char op; int time; }; Order order[MAX]; void make_Map(int n,int m) { int i,j; for(i=0;i<=n+1;i++) { for(j=0;j<=m+1;j++) { Map[i][j].have=false; Map[i][j].dir=0; Map[i][j].number=0; } } //将地图围起来,这里可以使用dir这个值来标记围墙 for(i=0;i<=n+1;i++) Map[i][0].dir=Map[i][m+1].dir=-1; for(i=0;i<=m+1;i++) Map[0][i].dir=Map[n+1][i].dir=-1; // for(i=0;i<=n+1;i++) // { // for(j=0;j<=m+1;j++) // { // printf("%d ",Map[i][j].dir); // } // puts(""); // } } bool go(int num,char op,int time) { // printf("num=%d op=%c time=%d\n",num,op,time); int i,j; int x1,y1; int number1,dir1; // for(i=1;i<=B;i++) // { // for(j=1;j<=A;j++) // { // printf("%d ",Map[i][j].number); // } // puts(""); // } for(i=1;i<=B;i++) { for(j=1;j<=A;j++) { if(Map[i][j].number==num) { x1=i; y1=j; break; } } } // printf("x1=%d y1=%d\n",x1,y1); if(op=='L') //右转90度 { for(i=1;i<=time;i++) { Map[x1][y1].dir=(Map[x1][y1].dir+1)%4; } } else if(op=='R') //左转90度 { for(i=0;i<time;i++) { Map[x1][y1].dir=(Map[x1][y1].dir-1); if(Map[x1][y1].dir==0) Map[x1][y1].dir=4; } } else //前进 { // printf("x1=%d y1=%d\n",x1,y1); // printf("Map[%d][%d].dir=%d\n",x1,y1,Map[x1][y1].dir); switch(Map[x1][y1].dir) { case 1: //往上走 number1=Map[x1][y1].number; dir1=Map[x1][y1].dir; Map[x1][y1].number=0; Map[x1][y1].have=!Map[x1][y1].have; // printf("This is case 1\n"); for(i=0;i<time;i++) { x1--; if(Map[x1][y1].have) //遇到了其他机器人 { printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number); return true; } if(Map[x1][y1].dir==-1)//撞到了墙 { printf("Robot %d crashes into the wall\n",number1); return true; } } Map[x1][y1].have=true; Map[x1][y1].dir=dir1; Map[x1][y1].number=number1; break; case 2: //往右走 number1=Map[x1][y1].number; dir1=Map[x1][y1].dir; Map[x1][y1].number=0; Map[x1][y1].have=!Map[x1][y1].have; // printf("This is case 2\n"); for(i=0;i<time;i++) { y1++; if(Map[x1][y1].have) //遇到了其他机器人 { printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number); return true; } if(Map[x1][y1].dir==-1)//撞到了墙 { printf("Robot %d crashes into the wall\n",number1); return true; } } Map[x1][y1].have=true; Map[x1][y1].dir=dir1; Map[x1][y1].number=number1; break; case 3://往下走 number1=Map[x1][y1].number; dir1=Map[x1][y1].dir; Map[x1][y1].number=0; Map[x1][y1].have=!Map[x1][y1].have; // printf("This is case 3\n"); for(i=0;i<time;i++) { x1++; if(Map[x1][y1].have) //遇到了其他机器人 { printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number); return true; } if(Map[x1][y1].dir==-1)//撞到了墙 { printf("Robot %d crashes into the wall\n",number1); return true; } } Map[x1][y1].have=true; Map[x1][y1].dir=dir1; Map[x1][y1].number=number1; break; case 4://往左走 number1=Map[x1][y1].number; dir1=Map[x1][y1].dir; Map[x1][y1].number=0; Map[x1][y1].have=!Map[x1][y1].have; // printf("This is case 4\n"); for(i=0;i<time;i++) { y1--; if(Map[x1][y1].have) //遇到了其他机器人 { printf("Robot %d crashes into robot %d\n",number1,Map[x1][y1].number); return true; } if(Map[x1][y1].dir==-1)//撞到了墙 { printf("Robot %d crashes into the wall\n",number1); return true; } } Map[x1][y1].have=true; Map[x1][y1].dir=dir1; Map[x1][y1].number=number1; break; } } return false; } int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); int T; cin>>T; while(T--) { cin>>A>>B; make_Map(B,A);//注意,题目给的方向要反过来 int N,M; cin>>N>>M; int i,j,k; int x1,y1; char c; for(i=0;i<N;i++) { scanf("%d %d %c",&y1,&x1,&c); Map[x1][y1].have=true; if(c=='S') Map[x1][y1].dir=1; else if(c=='E') Map[x1][y1].dir=2; else if(c=='N') Map[x1][y1].dir=3; else Map[x1][y1].dir=4; Map[x1][y1].number=i+1; // cout<<Map[x1][y1].number<<endl; // cout<<"x1="<<x1<<" "<<"y1="<<y1<<" "<<"c="<<c<<endl; } int number1; char op; int time; for(i=0;i<M;i++) { scanf("%d %c %d",&order[i].num,&order[i].op,&order[i].time); // printf("%d %c %d\n",order[i].num,order[i].op,order[i].time); } bool flag=false; for(i=0;i<M;i++) { // printf("num=%d op=%c time%d\n",order[i].num,order[i].op,order[i].time); if(go(order[i].num,order[i].op,order[i].time)) { flag=true; break; } } if(!flag) printf("OK\n"); } return 0; }