poj2632 Crashing Robots

//题意:题意很简单给一个坐标图,k代表样例个数,b,a代表举行长宽,n,m代表机器人数,指令数,n个表示机器人初始位置,m条指令,m条指令中F:直行,L:向左转(注意只是改变朝向,坐标不变)R:向右转(改变朝向,坐标不变)输出有三种情况:1.机器人可能走出这个表格撞墙;2.机器人撞到另一个机器人这两种情况;【注意:按照给的坐标的顺序就是机器人的编号】3.OK;是哪种情况就输出那种情况。【思路很简单,一定写的时候理清思路,做好注释,第一次写完运行时总是codeblocks弹窗闪退,改了半天自认为思路没问题但总是这样,恰逢poj服务器爆炸,就扔了一周左右回来改代码 ,最后发现本应该在样例全部输入完毕在输出,但我每次碰到,撞墙或者撞机器人后我直接break输出,导致命令并没有输入完,将break后的吓一条命令给了下一组a,b闪退,哇心态爆炸,看到的同学一定注意别被自己蠢死】

//思路:1.确定初始位置和朝向,并记录这两种属性(后面存在机器人互相撞的情况)【注意这里有坐标系变换的】;2.判断下一步操作然后先判断是否越界或者相撞,若发生以上情况则记录;3.更新记录;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>

using namespace std;

struct{
    int x, y;
    char turn;
}add_rob[120];
int xx, yy;

int vis[120][120];

void dirc(int rob_id)//一定注意数组下标与数轴的转化
{
    if(add_rob[rob_id].turn == 'E'){
            xx = add_rob[rob_id].x + 0;
            yy = add_rob[rob_id].y + 1;
    }else if(add_rob[rob_id].turn == 'S'){
            xx = add_rob[rob_id].x + 1;
            yy = add_rob[rob_id].y + 0;
    }else if(add_rob[rob_id].turn == 'W'){
            xx = add_rob[rob_id].x + 0;
            yy = add_rob[rob_id].y - 1;
    }else if(add_rob[rob_id].turn == 'N'){
            xx = add_rob[rob_id].x - 1;
            yy = add_rob[rob_id].y + 0;
    }
    return ;
}

void now_turn(int rob_id, int up_turn)
{
    if(add_rob[rob_id].turn == 'E'){
        if(up_turn == 'L'){
            add_rob[rob_id].turn = 'N';
        }else if(up_turn == 'R'){
            add_rob[rob_id].turn = 'S';
        }
    }else if(add_rob[rob_id].turn == 'S'){
        if(up_turn == 'L'){
            add_rob[rob_id].turn = 'E';
        }else if(up_turn == 'R'){
            add_rob[rob_id].turn = 'W';
        }
    }else if(add_rob[rob_id].turn == 'W'){
        if(up_turn == 'L'){
            add_rob[rob_id].turn = 'S';
        }else if(up_turn == 'R'){
            add_rob[rob_id].turn = 'N';
        }
    }else if(add_rob[rob_id].turn == 'N'){
        if(up_turn == 'L'){
            add_rob[rob_id].turn = 'W';
        }else if(up_turn == 'R'){
            add_rob[rob_id].turn = 'E';
        }
    }
    return ;
}

int main()
{
    int t;
    scanf("%d", &t);
    while(t--){
        //初始化
        int a, b;   //长宽
        int n_rob, m_ins;    //机器人数量 命令数量
        char getchar_;   //当前朝向 更新的方向(默认直走) 读掉空字符
        memset(vis, 0, sizeof(vis));    //机器人到某个坐标 当前坐标为占用其他坐标释放
        scanf("%d%d%d%d", &a, &b, &n_rob, &m_ins);
        for(int i = 1; i <= n_rob; i++){
            int dx, dy;
            scanf("%d%d%c%c", &dx, &dy, &getchar_, &add_rob[i].turn);
            add_rob[i].x = b + 1 - dy;
            add_rob[i].y = dx;
            vis[add_rob[i].x][add_rob[i].y] = i;
        }


        //每条命令执行情况
        int id, cnt, indx, indy;    //机器人id 每条命令执行次数 要跟新的方向 没发生事故的横纵坐标
        char turn_update;
        int end_id, end_xx, end_yy, isend = 0;
        for(int i = 0; i < m_ins; i++){
            scanf("%d%c%c%d", &id, &getchar_, &turn_update, &cnt);
            if(isend != 0)
                continue;
            while(cnt--){
                if(turn_update != 'F'){
                    now_turn(id, turn_update);
                }else{
                    dirc(id);
                    if(xx > b || yy > a || xx < 1 || yy < 1){
                        isend = 1;
                        end_id = id;
                        break;
                    }else if(vis[xx][yy] != 0){
                       isend = 2;
                       end_id = id;
                       end_xx = xx;
                       end_yy = yy;
                       break;
                    }
                    //更新记录
                    vis[add_rob[id].x][add_rob[id].y] = 0;
                    add_rob[id].x = xx;
                    add_rob[id].y = yy;
                    vis[xx][yy] = id;
                }
            }
        }
        if(isend == 1){
            printf("Robot %d crashes into the wall\n", end_id);
        }else if(isend == 2){
            printf("Robot %d crashes into robot %d\n", end_id, vis[end_xx][end_yy]);
        }else{
            printf("OK\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值