首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 2632 Crashing Robots:多机器人碰撞模拟

     編輯:關於C++

题目大意

A×B 工厂地图,N 个机器人(N≤100),M 条指令(M≤100)。指令:L/R 转向,F 前进 k 步。模拟执行,报告首次碰撞(撞墙或撞机器人),或 OK。

模拟要点

  • 方向编码:0=N, 1=W, 2=S, 3=E(顺时针)
  • L:dir = (dir + k) % 4,R:dir = (dir + 4 - k%4) % 4
  • F:逐步检查路径上是否越界或有机器人
  • 地图数组 map[x][y] 存机器人编号(0 为空)
  • 已发生碰撞后仍需读完剩余指令(不影响后续用例)

C++ 实现

#include 
#include 
using namespace std;

int map[105][105], A, B;
struct Robot { int x, y, dir; } r[101];

bool moveForward(int id, int step) {
    int x = r[id].x, y = r[id].y, d = r[id].dir;
    map[x][y] = 0;
    for (int i=1; i<=step; ++i) {
        int nx = x, ny = y;
        if (d==0) ny += 1;
        else if (d==1) nx -= 1;
        else if (d==2) ny -= 1;
        else nx += 1;
        if (nx<1 || nx>A || ny<1 || ny>B) {
            cout << "Robot " << id << " crashes into the wall" << endl;
            return false;
        }
        if (map[nx][ny]) {
            cout << "Robot " << id << " crashes into robot " << map[nx][ny] << endl;
            return false;
        }
        x = nx; y = ny;
    }
    map[x][y] = id;
    r[id].x = x; r[id].y = y;
    return true;
}

int main() {
    int K; cin >> K;
    while (K--) {
        int N, M; cin >> A >> B >> N >> M;
        memset(map, 0, sizeof(map));
        for (int i=1;i<=N;++i) {
            char c; cin >> r[i].x >> r[i].y >> c;
            r[i].dir = (c=='N'?0:c=='W'?1:c=='S'?2:3);
            map[r[i].x][r[i].y] = i;
        }
        bool ok = true;
        while (M--) {
            int id, step; char cmd;
            cin >> id >> cmd >> step;
            if (!ok) continue;
            if (cmd=='L') r[id].dir = (r[id].dir + step) % 4;
            else if (cmd=='R') r[id].dir = (r[id].dir + 4 - step%4) % 4;
            else ok = moveForward(id, step);
        }
        if (ok) cout << "OK" << endl;
    }
    return 0;
}

复杂度

  • 每指令 O(step) ≤ 100,总步数 ≤ 10000
  • 极快通过

关键细节

  1. 坐标系:x 为行(1..A),y 为列(1..B)
  2. 方向编码:巧妙设计使 L/R 为简单加减模 4
  3. 碰撞后继续读入:避免输入流错位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved