poj 2632 Crashing Robots

来源:互联网 发布:pscs3软件百度云 编辑:程序博客网 时间:2024/05/21 06:46
Crashing Robots
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 10070 Accepted: 4281

Description

In a modernized warehouse, robots are used to fetch the goods. Careful planning is needed to ensure that the robots reach their destinations without crashing into each other. Of course, all warehouses are rectangular, and all robots occupy a circular floor space with a diameter of 1 meter. Assume there are N robots, numbered from 1 through N. You will get to know the position and orientation of each robot, and all the instructions, which are carefully (and mindlessly) followed by the robots. Instructions are processed in the order they come. No two robots move simultaneously; a robot always completes its move before the next one starts moving. 
A robot crashes with a wall if it attempts to move outside the area of the warehouse, and two robots crash with each other if they ever try to occupy the same spot.

Input

The first line of input is K, the number of test cases. Each test case starts with one line consisting of two integers, 1 <= A, B <= 100, giving the size of the warehouse in meters. A is the length in the EW-direction, and B in the NS-direction. 
The second line contains two integers, 1 <= N, M <= 100, denoting the numbers of robots and instructions respectively. 
Then follow N lines with two integers, 1 <= Xi <= A, 1 <= Yi <= B and one letter (N, S, E or W), giving the starting position and direction of each robot, in order from 1 through N. No two robots start at the same position. 
 
Figure 1: The starting positions of the robots in the sample warehouse

Finally there are M lines, giving the instructions in sequential order. 
An instruction has the following format: 
< robot #> < action> < repeat> 
Where is one of 
  • L: turn left 90 degrees, 
  • R: turn right 90 degrees, or 
  • F: move forward one meter,

and 1 <= < repeat> <= 100 is the number of times the robot should perform this single move.

Output

Output one line for each test case: 
  • Robot i crashes into the wall, if robot i crashes into a wall. (A robot crashes into a wall if Xi = 0, Xi = A + 1, Yi = 0 or Yi = B + 1.) 
  • Robot i crashes into robot j, if robots i and j crash, and i is the moving robot. 
  • OK, if no crashing occurs.

Only the first crash is to be reported.

Sample Input

4     //数据的组数5 4    //机器人能走的矩阵大小(就是上面那个图)2 2     //机器人数量(这里是二)  指令数量1 1 E    //机器人1所在的位置  它面向的方向5 4 W    //机器人2所在的位置  它面向的方向1 F 7    //机器人1 先前走  7步2 F 7  5 42 41 1 E5 4 W1 F 32 F 11 L 1     //左转90*1度1 F 3    5 42 21 1 E5 4 W1 L 96   //左转90*96度(也就是不转)1 F 25 42 31 1 E5 4 W1 F 41 L 11 F 20

Sample Output

Robot 1 crashes into the wall    //机器人1超出矩阵Robot 1 crashes into robot 2     //1撞2OK                                //平安无事Robot 1 crashes into robot 2
题的大意是
让机器人走格子,找出第一个错误来,就是所示的三种情况
#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;int fx[4] = {0,-1,0,1};    int fy[4] = {-1,0,1,0};struct node{    int x,y;    //所在的位置    int z;      //状态也就是面向方向}a[50005];char ch;int b[2];int main(){    int t,n,m,i;    scanf("%d",&t);    int u,p;    int h,g;    while(t--)    {        int ok = 0;        scanf("%d %d %d %d",&n,&m,&u,&p);        for(i = 1;i <= u; i++)        {            scanf("%d %d %c",&h,&g,&ch);            a[i].x = g;            a[i].y = h;            if(ch == 'W')     //W是方向0也就是接下来走fx[0],fy[0]            {                a[i].z = 0;            }            if(ch == 'S')    //同上            {                a[i].z = 1;            }            if(ch == 'E')            {                a[i].z = 2;            }            if(ch == 'N')            {                a[i].z = 3;            }        }        while(p--)        {            scanf("%d %c %d",&h,&ch,&g);            if(ch == 'F')            {                while(g--)                                  {                    a[h].x = a[h].x+fx[a[h].z];    //一步一步的走                     a[h].y = a[h].y+fy[a[h].z];                    if(a[h].x > m||a[h].x <= 0||a[h].y > n||a[h].y <= 0)                    {                        if(ok == 0)          //如果没错                        {                            ok = 2;                            b[0] = h;                        }                    }                    for(int e = 1; e <= u; e++)    //这里很耗时的可以有一个优化就是用二维数组来存机器人在哪                    {                        if(h != e&&ok == 0)                        {                            if(a[h].x == a[e].x&&a[h].y == a[e].y)   //撞上                            {                                ok = 1;                                b[0] = h,b[1] = e;          //存撞上的两个机器人                            }                        }                    }                }            }            if(ch == 'L')     //转向 也就是方向的改变            {                g = g%4;                a[h].z = a[h].z+g;                a[h].z = a[h].z%4;            }            if(ch == 'R')            {                g = g%4;                if(a[h].z >= g)                    a[h].z = a[h].z-g;                else                    a[h].z = a[h].z+4-g;            }        }        if(ok == 0)        {            printf("OK\n");        }        else if(ok == 1)        {            printf("Robot %d crashes into robot %d\n",b[0],b[1]);        }        else        {            printf("Robot %d crashes into the wall\n",b[0]);        }    }}
代码菜鸟,如有错误,请多包涵!!
0 0
原创粉丝点击