POJ2632

来源:互联网 发布:mac怎么进硬件检测模式 编辑:程序博客网 时间:2024/05/21 17:33
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct _ROBOT_
{
    int  x;
    int  y;
    char c_pos;
    int  i_pos;
}Robot;

typedef struct _INSTRUCTIONS_
{
    int ID;
    char action;
    int repeat;
}Instruction;

int main()
{
    int K, A, B, N, M;
    Robot r[100];
    Instruction ins[100];
    int i, j, k;
    int temp1 = 0;

    scanf("%d", &K);
    while (K--)
    {
        memset(r, 0, sizeof(r));
        memset(ins, 0, sizeof(ins));

        scanf("%d %d", &A, &B);
        if (A < 0 || A > 100 || B < 0 || B > 100)
        {
            return -1;
        }
        scanf("%d %d", &N, &M);
        if (N < 0 || N > 100 || M < 0 || M > 100)
        {
            return -1;
        }

        for (i = 1; i <= N; i++)
        {
            scanf("%d %d %c", &r[i].x, &r[i].y, &r[i].c_pos);
            switch(r[i].c_pos)
            {
            case 'N':
                r[i].i_pos = 0;
                break;
            case 'E':
                r[i].i_pos = 1;
                break;
            case 'S':
                r[i].i_pos = 2;
                break;
            case 'W':
                r[i].i_pos = 3;
                break;
            default:
                printf("error\n");
                break;
            }
        }

        for (i = 1; i <= M; i++)
            scanf("%d %c %d", &ins[i].ID, &ins[i].action, &ins[i].repeat);

        for(i = 1; i <= M; i++)
        {
            temp1 = 0;
            switch(ins[i].action)
            {
            case 'L':
                {
                    if(ins[i].repeat%4 == 0)
                        r[ins[i].ID].i_pos = r[ins[i].ID].i_pos;
                    else if(ins[i].repeat%4 == 1)
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos -1)%4;
                    else if(ins[i].repeat%4 == 2)
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos - 2)%4;
                    else
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos - 3)%4;
                    break;
                }
            case 'R':
                {
                    if(ins[i].repeat%4 == 0)
                        r[ins[i].ID].i_pos = r[ins[i].ID].i_pos;
                    else if(ins[i].repeat%4 == 1)
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos + 1)%4;
                    else if(ins[i].repeat%4 == 2)
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos + 2)%4;
                    else
                        r[ins[i].ID].i_pos = (r[ins[i].ID].i_pos + 3)%4;
                    break;
                }
            case 'F':
                {                    
                    switch(r[ins[i].ID].i_pos)
                    {
                    case 0:
                        for (j = 1; j <= ins[i].repeat; j++)
                        {
                            r[ins[i].ID].y++;

                            if (r[ins[i].ID].y > B)
                            {
                                printf("Robot %d crashes into the wall\n", ins[i].ID);
                                temp1 = 1;
                            }

                            if(!temp1)
                            {
                                for (k = 1; k <= N; k++)
                                {
                                    if (k == ins[i].ID)
                                    {
                                        continue;
                                    }
                                    if ( (r[ins[i].ID].x == r[k].x) && (r[ins[i].ID].y == r[k].y) )
                                    {
                                        printf("Robot %d crashes into robot %d\n", ins[i].ID, k);
                                        temp1 = 1;
                                        break;
                                    }
                                }
                            }

                            if(temp1)
                                break;
                        }
                        break;
                    case 1:                
                        for (j = 1; j <= ins[i].repeat; j++)
                        {
                            r[ins[i].ID].x++;

                            if (r[ins[i].ID].x > A)
                            {
                                printf("Robot %d crashes into the wall\n", ins[i].ID);
                                temp1 = 1;
                            }

                            if (!temp1)
                            {
                                for (k = 1; k <= N; k++)
                                {
                                    if (k == ins[i].ID)
                                    {
                                        continue;
                                    }
                                    if ( (r[ins[i].ID].x == r[k].x) && (r[ins[i].ID].y == r[k].y) )
                                    {
                                        printf("Robot %d crashes into robot %d\n", ins[i].ID, k);
                                        temp1 = 1;
                                        break;
                                    }
                                }
                            }

                            if(temp1)
                                break;
                        }
                        break;
                    case 2:
                        for (j = 1; j <= ins[i].repeat; j++)
                        {
                            r[ins[i].ID].y--;

                            if (r[ins[i].ID].y < 0)
                            {
                                printf("Robot %d crashes into the wall\n", ins[i].ID);
                                temp1 = 1;
                            }


                            if (!temp1)
                            {
                                for (k = 1; k <= N; k++)
                                {
                                    if (k == ins[i].ID)
                                    {
                                        continue;
                                    }
                                    if ( (r[ins[i].ID].x == r[k].x) && (r[ins[i].ID].y == r[k].y) )
                                    {
                                        printf("Robot %d crashes into robot %d\n", ins[i].ID, k);
                                        temp1 = 1;
                                    }
                                }
                            }

                            if(temp1)
                                break;
                        }
                        break;
                    case 3:
                        for (j = 1; j <= ins[i].repeat; j++)
                        {
                            r[ins[i].ID].x--;

                            if (r[ins[i].ID].x < 0)
                            {
                                printf("Robot %d crashes into the wall\n", ins[i].ID);
                                temp1 = 1;
                            }                    

                            if (!temp1)
                            {
                                for (k = 1; k <= N; k++)
                                {
                                    if (k == ins[i].ID)
                                    {
                                        continue;
                                    }
                                    if ( (r[ins[i].ID].x == r[k].x) && (r[ins[i].ID].y == r[k].y) )
                                    {
                                        printf("Robot %d crashes into robot %d\n", ins[i].ID, k);
                                        temp1 = 1;
                                    }
                                }
                            }

                            if(temp1)
                                break;
                        }
                        break;
                    }
                    break;
                }
            }
            if(temp1)
                break;
        }

        if(!temp1)
        {
            printf("OK\n");
        }        
    }    

    return 0;
}