【POJ2632】Crashing Robots

题目传送门

本题知识点:模拟

模拟机器人的运作过程,分别有三种功能,L 则是左转90°,R 则是右转90°,L 则是前进1格。让我们去模拟并判断它们的状态。

输入:

第一行是测试样例

第二行分别是矩形的长、宽(比如,5 4)

// 题目是讲得很清楚的
// 4
// 3
// 2
// 1
//   1 2 3 4 5 

第三行分别是机器人的个数以及指令条数

接下来是先输入每个机器人的初始状态(有多少个机器人就多少行),3个数值分别对应机器人所在位置的(x, y)以及机器人所面向的方向(因为 F 指令只能让机器人向前,所以懂得东南西北是很重要的一件事)

同样,接下来有多少条指令就输入多少行,3个数值分别对应机器人的号数,对应指令,以及执行该指令的次数。

等一切输入完后就可以执行(模拟)了。

输出有三种情况

一种是撞墙的

一种是撞机器人的

剩下的是每条指令都通过并没有发生意外(撞墙或撞机器人)的

对于前两种,我们得只输出一次就可以不管后面的了,因为题目要求只输出一次情况

但如果在输入时就开始模拟的话,中断了就会影响后面的输入,所以我弄了个结构体去存执行指令

剩下的,就看自己是否细心与耐心了

我语言比较菜,所以代码写得很长,很暴力,感觉有些地方还可以写的简练一点,但由于自己懒,想快水过去好睡觉了。

数据很小。

// POJ 2632
#include<iostream>
#include<cstdio>
using namespace std;

int T;
int W, H, robot_n, t;
struct node{
    int w, h;
    char to;
}rob[102];
struct e{
    int who, re;
    char done;
}take[102];
//char pla[102][102];

void show(){
    for(int i = 1; i <= robot_n; i++){
        printf("i:%d w:%d h:%d\n", i, rob[i].w, rob[i].h);
    }
}

int main()
{
    scanf("%d", &T);
    while(T--){
        bool last = true;
        // take in
        scanf("%d %d", &W, &H);
        scanf("%d %d", &robot_n, &t);
        for(int i = 1; i <= robot_n; i++) scanf("%d %d %c", &rob[i].w, &rob[i].h, &rob[i].to);
        for(int i = 1; i <= t; i++) scanf("%d %c %d", &take[i].who, &take[i].done, &take[i].re);

        // done!
        for(int i= 1; i <= t; i++){
            int it = take[i].who;
            char bi = take[i].done;
            int num = take[i].re;

            // 转向
            if(bi == 'L'){
                num = num % 4;
                while(num > 0){
                    if(rob[it].to == 'N') rob[it].to = 'W';
                    else if(rob[it].to == 'W') rob[it].to = 'S';
                    else if(rob[it].to == 'S') rob[it].to = 'E';
                    else if(rob[it].to == 'E') rob[it].to = 'N';
                    num--;
                }
            }
            else if(bi == 'R'){
                num = num % 4;
                while(num > 0){
                    if(rob[it].to == 'N') rob[it].to = 'E';
                    else if(rob[it].to == 'E') rob[it].to = 'S';
                    else if(rob[it].to == 'S') rob[it].to = 'W';
                    else if(rob[it].to == 'W') rob[it].to = 'N';
                    num--;
                }
            }
            // 前进
            else if(bi == 'F'){
                char go = rob[it].to;
                // 北
                if(go == 'N'){
                    while(num > 0){
                        rob[it].h++;
                        // wall
                        if(rob[it].h > H){
                            printf("Robot %d crashes into the wall\n", it);
                            last = false;
                            break;
                        }
                        // robot
                        bool can = true; // 跳出遍历
                        for(int i = 1; i <= robot_n; i++){
                            if(i == it) continue;
                            if(rob[it].h == rob[i].h && rob[it].w == rob[i].w){
                                printf("Robot %d crashes into robot %d\n", it, i);
                                can = false;
                                last = false;
                                break;
                            }
                        }
                        if(!can) break;
                        num--;
                    }
                }
                // 西
                else if(go == 'W'){
                    while(num > 0){
                        rob[it].w--;
                        // wall
                        if(rob[it].w < 1){
                            printf("Robot %d crashes into the wall\n", it);
                            last = false;
                            break;
                        }
                        // robot
                        bool can = true;
                        for(int i = 1; i <= robot_n; i++){
                            if(i == it) continue;
                            if(rob[it].h == rob[i].h && rob[it].w == rob[i].w){
                                printf("Robot %d crashes into robot %d\n", it, i);
                                can = false;
                                last = false;
                                break;
                            }
                        }
                        if(!can) break;
                        num--;
                    }
                }
                // 南
                else if(go == 'S'){
                    while(num > 0){
                        rob[it].h--;
                        // wall
                        if(rob[it].h < 1){
                            printf("Robot %d crashes into the wall\n", it);
                            last = false;
                            break;
                        }
                        // robot
                        bool can = true;
                        for(int i = 1; i <= robot_n; i++){
                            if(i == it) continue;
                            if(rob[it].h == rob[i].h && rob[it].w == rob[i].w){
                                printf("Robot %d crashes into robot %d\n", it, i);
                                can = false;
                                last = false;
                                break;
                            }
                        }
                        if(!can) break;
                        num--;
                    }
                }
                // 东
                else if(go == 'E'){
                    while(num > 0){
                        rob[it].w++;
                        // wall
                        if(rob[it].w > W){
                            printf("Robot %d crashes into the wall\n", it);
                            last = false;
                            break;
                        }
                        // robot
                        bool can = true;
                        for(int i = 1; i <= robot_n; i++){
                            if(i == it) continue;
                            if(rob[it].h == rob[i].h && rob[it].w == rob[i].w){
                                printf("Robot %d crashes into robot %d\n", it, i);
                                can = false;
                                last = false;
                                break;
                            }
                        }
                        if(!can) break;
                        num--;
                    }
                }
            }
            // 中断剩余操作防止过多输出
            if(!last) break;
        }
        // 跳过 OK
        if(!last) continue;
        printf("OK\n");
    }
    return 0;
}

posted on 2019-09-17 00:45  Ayasan  阅读(172)  评论(0编辑  收藏  举报