https://www.acmicpc.net/problem/8972

 

 

 

#문제 간단 정리

시뮬레이션 문제..

천천히 구현을 하자

 

#문제 해결 방법

 

1.종수가 움직임

    -> 만약 움직일 위치에 로봇이있다면 이동횟수 출력하고 종료

2. 로봇이 움직임

    -> 8개의 방향에 대해서 가장 종수랑 가까워 지는 방향을 계산

    -> 2차원배열에 로봇들의 개수를 입력

    ->2개이상이면  '.'으로 1개라면 'R'로 맵에 입력 0개라면 로봇이 없으니 '.'로 입력

 

#전체 코드

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
using namespace std;

int dx[9] = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };
int dy[9] = { 1, 1, 1, 0, 0, 0, -1, -1, -1 };

vector<vector<char>> world;
pair<int, int> jong;
vector<pair<int, int>> robots;
int r, c;
int moveCount;

bool boundary(int y, int x) {
    return (0 <= y && y < r && 0 <= x && x < c);
}

bool moveJong(int input) {
    int ny = jong.first + dy[input];
    int nx = jong.second + dx[input];

    if (world[ny][nx] == 'R') {
        cout << "kraj " << moveCount + 1 << '\n';
        return false;
    }
    else {
        world[jong.first][jong.second] = '.';
        jong = { ny, nx };
        world[ny][nx] = 'I';
        moveCount++;
        return true;
    }
}

void moveRobot() {
    vector<vector<int>> newPos(r, vector<int>(c, 0));
    vector<pair<int, int>> newRobots;

    for (auto& robot : robots) {
        int minDist = 1e9;
        int bestY = robot.first, bestX = robot.second;

        for (int i = 0; i < 9; i++) {
            int ny = robot.first + dy[i];
            int nx = robot.second + dx[i];
            if (boundary(ny, nx)) {
                int dist = abs(ny - jong.first) + abs(nx - jong.second);
                if (dist < minDist) {
                    minDist = dist;
                    bestY = ny;
                    bestX = nx;
                }
            }
        }

        if (world[bestY][bestX] == 'I') {
            cout << "kraj " << moveCount << '\n';
            exit(0);
        }
        newPos[bestY][bestX]++;
        newRobots.push_back({ bestY, bestX });
    }

    robots.clear();
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            if (newPos[i][j] == 1) {
                robots.push_back({ i, j });
                world[i][j] = 'R';
            }
            else if (newPos[i][j] > 1) {
                world[i][j] = '.';
            }
            else if (newPos[i][j] == 0) {
                world[i][j] = '.';
            }
        }
    }
    world[jong.first][jong.second] = 'I';
}

int main() {
    cin >> r >> c;
    world.resize(r, vector<char>(c));

    for (int i = 0; i < r; i++) {
        string s;
        cin >> s;
        for (int j = 0; j < c; j++) {
            world[i][j] = s[j];
            if (s[j] == 'I') {
                jong = { i, j };
            }
            else if (s[j] == 'R') {
                robots.push_back({ i, j });
            }
        }
    }

    string command;
    cin >> command;
    moveCount = 0;

    for (char cmd : command) {
        if (!moveJong(cmd - '1')) {
            return 0;
        }
        moveRobot();
    }

    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cout << world[i][j];
        }
        cout << '\n';
    }

    return 0;
}

'[백준] > C++' 카테고리의 다른 글

백준 12904번 A와 B [C++]  (1) 2024.07.23
백준 31962번 밤양갱 [C++]  (3) 2024.07.23
백준 2638번 치즈 [C++]  (0) 2024.07.18
백준 10703번 유성 [C++]  (0) 2024.07.11
백준 1456번 거의 소수 [C++]  (0) 2024.07.08

+ Recent posts