[백준/BOJ] 백준 8972번 : 미친 아두이노
2023. 10. 20. 01:32ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/8972
move1 함수를 통해, 종수의 아두이노가 이동하는 것을 나타냈고, move2 함수를 통해 미친 아두이노들이 이동하는 것을 나타내어, 이를 구현해 문제를 해결했다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int r, c;
vector<string> order;
vector<vector<int>> board(105, vector<int>(105, 0));
vector<pair<int, int>> crazy;
pair<int, int> here; //종수의 아두이노 위치
string result = "";
int dxdy[10][2] = { {0,0},{1,-1},{1,0},{1,1},{0,-1},{0,0},{0,1},{-1,-1},{-1,0},{-1,1} };
//종수의 아두이노 이동
bool move1(int dir) {
pair<int, int> there = make_pair(here.first + dxdy[dir][0], here.second + dxdy[dir][1]);
if (board[there.first][there.second] > 0) {
return false;
}
here = there;
return true;
}
//미친 아두이노 이동
bool move2() {
vector<vector<int>> next_board(105, vector<int>(105, 0));
for (int i = 0; i < crazy.size(); i++) {
pair<int, int> point = crazy[i];
int min_len = 987654321;
pair<int, int> next_point;
for (int dir = 1; dir <= 9; dir++) {
if (dir == 5) {
continue;
}
int this_len = abs(here.first - (crazy[i].first + dxdy[dir][0])) + abs(here.second - (crazy[i].second + dxdy[dir][1]));
if (this_len < min_len) {
min_len = this_len;
next_point = make_pair((crazy[i].first + dxdy[dir][0]), (crazy[i].second + dxdy[dir][1]));
}
}
//종수의 아두이노 칸으로 이동하는 경우
if (next_point == here) {
return false;
}
next_board[next_point.first][next_point.second]++;
}
crazy.clear();
//2개 이상이 뭉치는 경우는 폭발
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (next_board[i][j] >= 2) {
next_board[i][j] = 0;
}
else if (next_board[i][j] == 1) {
crazy.push_back(make_pair(i, j));
}
}
}
board = next_board;
return true;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> r >> c;
for (int i = 0; i < r; i++) {
string input;
cin >> input;
for (int j = 0; j < input.size(); j++) {
if (input[j] == 'I') {
here = make_pair(i, j);
}
else if (input[j] == 'R') {
crazy.push_back(make_pair(i, j));
board[i][j] = 1;
}
}
}
string input;
cin >> input;
for (int i = 0; i < input.size(); i++) {
bool ret;
ret = move1(input[i] - '0');
if (ret == false) {
result = "kraj " + to_string(i + 1);
break;
}
ret = move2();
if (ret == false) {
result = "kraj " + to_string(i + 1);
break;
}
}
if (result.size() > 0) {
cout << result;
}
else {
board[here.first][here.second] = -1; //종수의 위치 표시
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (board[i][j] == -1) {
cout << "I";
}
else if (board[i][j] == 1) {
cout << "R";
}
else {
cout << ".";
}
}
cout << "\n";
}
}
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 15462번 : The Bovine Shuffle (0) | 2023.10.20 |
---|---|
[백준/BOJ] 백준 7570번 : 줄 세우기 (0) | 2023.10.20 |
[백준/BOJ] 백준 1915번 : 가장 큰 정사각형 (0) | 2023.10.20 |
[백준/BOJ] 백준 10942번 : 팰린드롬? (0) | 2023.10.20 |
[백준/BOJ] 백준 22944번 : 죽음의 비 (0) | 2023.10.20 |