天天看點

poj2632 Crashing Robots 模拟水題

2014-03-09 11:37:46

題意就不解釋了,很容易明白,直接上代碼

///2014.3.8
///poj2632

/**
 *模拟水題,主要是細心
 *寫了好長時間,自己程式設計速度還是不夠
 *速度不夠有幾個原因
 *首先是整體思維的把握不夠強烈,
 *     有寫到後面改前面的情況
 *其次是編碼不夠熟練,積累不夠
 */

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct robot{
    int x,y;  ///位置
    int direction;  ///方向,0表示向東,1表示向北,
                    ///      2表示向西,3表示向南。
};

struct instr{   ///指令,instructions
    int num;    ///機器人編号
    char act;   ///行為
    int step;      ///執行行為的次數
};

int main( )
{
//    freopen("in","r",stdin);
//    freopen("out","w",stdout);

    int K;  ///case數目
    scanf("%d",&K);
    while( K-- ){
        int A,B;  ///機器人活動區域大小,A表示長,B表示寬
        scanf("%d%d",&A,&B);
        int N,M;  ///N是機器人數目,M是指令數目
        scanf("%d%d",&N,&M);

        int area[A+1][B+1];  ///機器人的活動區域
                             ///每一個點的資料是該點的無機器人号
                             ///0表示該點沒有機器人
        memset(&area[0][0],0,sizeof(int)*(A+1)*(B+1) ); ///初始化,全設為0(沒有機器人)
        robot rob[N+1];
        for(int i=1 ; i<=N ; i++){   ///讀入機器人位置和方向
            cin>>rob[i].x>>rob[i].y;
            area[rob[i].x][rob[i].y] = i;
            char direction;
            cin>>direction;
            switch( direction ){
            case 'E':
                rob[i].direction = 0; break;
            case 'N':
                rob[i].direction = 1; break;
            case 'W':
                rob[i].direction = 2; break;
            case 'S':
                rob[i].direction = 3; break;
            }
        }

        bool OK = true;
        int robotNum,carshNum;
        for(int m=0 ; m<M ; m++){
            instr ins;
            cin>>ins.num>>ins.act>>ins.step;
            if( OK ){
                    switch( ins.act ){
                    case 'L':
                        rob[ins.num].direction = (rob[ins.num].direction+1*ins.step)%4;
                        break;
                    case 'R':
                        rob[ins.num].direction = (rob[ins.num].direction+3*ins.step)%4;
                        break;
                    case 'F':
                        for(int j=0 ; j<ins.step ; j++){
                            if( !OK ) break;
                            int next_x,next_y;
                            switch( rob[ins.num].direction ){
                            case 0:
                                {
                                    next_x = rob[ins.num].x + 1;
                                    next_y = rob[ins.num].y;
                                    if( next_x>A ){
                                        robotNum = ins.num;
                                        carshNum = -1;   ///撞到-1号機器人表示撞牆
                                        OK = false;
                                    }
                                    else if( area[next_x][next_y] ){
                                        robotNum = ins.num;
                                        carshNum = area[next_x][next_y];
                                        OK = false;
                                    }
                                    else{
                                        area[next_x][next_y] = ins.num;
                                        area[rob[ins.num].x][rob[ins.num].y] = 0;
                                        rob[ins.num].x = next_x;
                                        rob[ins.num].y = next_y;
                                    }
                                } break;
                            case 1:
                                {
                                    next_x = rob[ins.num].x;
                                    next_y = rob[ins.num].y+1;
                                    if( next_y>B ){
                                        robotNum = ins.num;
                                        carshNum = -1;   ///撞到-1号機器人表示撞牆
                                        OK = false;
                                    }
                                    else if( area[next_x][next_y] ){
                                        robotNum = ins.num;
                                        carshNum = area[next_x][next_y];
                                        OK = false;
                                    }
                                    else{
                                        area[next_x][next_y] = ins.num;
                                        area[rob[ins.num].x][rob[ins.num].y] = 0;
                                        rob[ins.num].x = next_x;
                                        rob[ins.num].y = next_y;
                                    }
                                } break;
                            case 2:
                                {
                                    next_x = rob[ins.num].x-1;
                                    next_y = rob[ins.num].y;
                                    if( next_x<1 ){
                                        robotNum = ins.num;
                                        carshNum = -1;   ///撞到-1号機器人表示撞牆
                                        OK = false;
                                    }
                                    else if( area[next_x][next_y] ){
                                        robotNum = ins.num;
                                        carshNum = area[next_x][next_y];
                                        OK = false;
                                    }
                                    else{
                                        area[next_x][next_y] = ins.num;
                                        area[rob[ins.num].x][rob[ins.num].y] = 0;
                                        rob[ins.num].x = next_x;
                                        rob[ins.num].y = next_y;
                                    }
                                } break;
                            case 3:
                                {
                                    next_x = rob[ins.num].x;
                                    next_y = rob[ins.num].y-1;
                                    if( next_y<1 ){
                                        robotNum = ins.num;
                                        carshNum = -1;   ///撞到-1号機器人表示撞牆
                                        OK = false;
                                    }
                                    else if( area[next_x][next_y] ){
                                        robotNum = ins.num;
                                        carshNum = area[next_x][next_y];
                                        OK = false;
                                    }
                                    else{
                                        area[next_x][next_y] = ins.num;
                                        area[rob[ins.num].x][rob[ins.num].y] = 0;
                                        rob[ins.num].x = next_x;
                                        rob[ins.num].y = next_y;
                                    }
                                } break;
                            }
                        }
                    }
            }
        }

        if( OK )
            cout<<"OK"<<endl;
        else{
            if( carshNum==-1 )
                printf("Robot %d crashes into the wall\n",robotNum);
            else
                printf("Robot %d crashes into robot %d\n",robotNum,carshNum);
        }
    }
    return 0;
}