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 |