[백준/BOJ] 백준 8972번 : 미친 아두이노

2023. 10. 20. 01:32알고리즘 문제풀이

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

 

8972번: 미친 아두이노

요즘 종수는 아두이노를 이용해 "Robots"이라는 게임을 만들었다. 종수는 아두이노 한대를 조정하며, 미친 아두이노를 피해다녀야 한다. 미친 아두이노는 종수의 아두이노를 향해 점점 다가온다.

www.acmicpc.net

 

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;
}