반응형
구현 문제였습니다.
풀이방법
1. 매 이동마다 문제에 나와있는 1 ~ 5를 수행합니다.
2. 종수를 이동시킵니다. 이 때 이동하려는 곳에 미친 아두이노가 있다면 X 번째 움직임을 반환합니다. 잘 이동한다면 이동시킨 후 0을 반환합니다.
3. 미친 아두이노들을 이동시킵니다. 최소 거리로 이동시킵니다. map으로 미친 아두이노들의 r,c좌표를 pair로 하여 key를 설정하고 그곳의 아두이노 개수를 저장해줍니다.
4. 0이 아닌 값이 move변수에 저장되어있다면 제대로 이동하지 못하고 게임이 종료 됩니다.
5. i,j구역에 미친 아두이노의 개수가 없거나 1초과해서 있다면 key를 지워줍니다.
Code
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dx[] = {0, 1, 1, 1, 0, 0, 0, -1, -1,-1};
int dy[] = {0,-1, 0, 1,-1, 0, 1, -1, 0, 1};
string moveInfo;
struct Jongsu {int x, y;};
Jongsu jongsu;
char board[101][101];
map <pair<int,int>,int> arduino;
int moveJongsu(int dir, int move){
board[jongsu.x][jongsu.y] = '.';
jongsu.x += dx[dir];
jongsu.y += dy[dir];
if(board[jongsu.x][jongsu.y] != '.') return move;
board[jongsu.x][jongsu.y] = 'I';
return 0;
}
int moveArduino(int move){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(board[i][j] == 'R'){
int moveDir = 0;
int minDist = 0x3f3f3f3f;
for(int dir = 1; dir <= 9; dir++){
int nx = i + dx[dir];
int ny = j + dy[dir];
if(0 > nx || nx >= n || 0 > ny || ny >= m) continue;
int dist = abs(nx - jongsu.x) + abs(ny - jongsu.y);
if(minDist > dist){
moveDir = dir;
minDist = dist;
}
}
int nx = i + dx[moveDir];
int ny = j + dy[moveDir];
if(board[nx][ny] == 'I') return move;
if(arduino[{i,j}]) arduino[{i,j}]--;
arduino[{nx,ny}]++;
}
}
}
return 0;
}
void boom(){
vector <pair<int,int>> v;
for(auto &a : arduino){
if(a.second != 1) v.push_back(a.first);
}
for(auto &p : v){
arduino.erase(p);
}
}
void updateBoard(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
board[i][j] = '.';
}
}
board[jongsu.x][jongsu.y] = 'I';
for(auto &a : arduino){
pair <int,int> p = a.first;
board[p.first][p.second] = 'R';
}
}
void print(){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++) {
cout << board[i][j];
}
cout << '\n';
}
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> board[i][j];
if(board[i][j] == 'I') jongsu.x = i, jongsu.y = j;
if(board[i][j] == 'R') arduino[{i,j}] = 1;
}
}
cin >> moveInfo;
for(int i = 0; i < moveInfo.size(); i++){
int dir = moveInfo[i] - '0';
int move = 0;
move = max(move,moveJongsu(dir,i+1));
move = max(move,moveArduino(i + 1));
if(move){
cout << "kraj " << move << '\n';
return 0;
}
boom();
updateBoard();
}
print();
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 1722번 : 순열의 순서 (0) | 2021.05.03 |
---|---|
(C++) - 백준(BOJ) 17135번 : 캐슬 디펜스 (0) | 2021.04.30 |
(C++) - 백준(BOJ) 11559번 : Puyo Puyo (0) | 2021.04.29 |
(C++) - 백준(BOJ) 2828번 : 사과 담기 게임 (0) | 2021.04.25 |
(C++) - 백준(BOJ) 2526번 : 싸이클 (0) | 2021.04.24 |