어흥

[백준 16179] 두 동전 (C++) 본문

알고리즘/백준

[백준 16179] 두 동전 (C++)

라이언납시오 2020. 3. 11. 19:15
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/16197

 

16197번: 두 동전

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, 두 동전의 위치는 다르다. 버튼은 "왼쪽", "오른쪽", "위", "아래"와 같이 4가지가 있다. 버튼을 누르면 두 동전이 버튼에 쓰여 있는 방향으로 동시에 이동하게 된다. 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다. 동전이 이동하려는 방향에 칸이 없

www.acmicpc.net

1. 주의할 점

- 문제에 적힌대로만 정확히 구현하면 된다

- 최대 4^10의 경우의 수가 나오며, 이후 계산까지 포함해서 2초를 넘기지 않도록 잘 설계한다.

 

2. 구현

- 이 문제는 구슬탈출2와 상당히 흡사하다. 차이점으로는 구멍으로의 탈출이 아닌 외부로의 탈출이며 1초당 1칸 이동, 2개의 동전을 겹칠 수 있다(단, 서로의 영향은 받지 않는다).

- DFS를 통해 나올 수 있는 버튼의 경우의 수를 구한다(4^10)

- 해당 경우의 수에 대해 start를 시행한다.

- Result보다 많은 수의 버튼을 눌러야 한다면 Return한다

 

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct info {
	int x, y;
};
info tmp;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
int row, col, result = 11;
char arr[20][20];
vector<info> coin[2];
vector<int> order;

void start() {
	int t_result;
	int c1x = coin[0][0].x;
	int c1y = coin[0][0].y;
	int c2x = coin[1][0].x;
	int c2y = coin[1][0].y;
	int n1x, n1y, n2x, n2y, out;
	for (int t = 0; t < 10; t++) {
		if (t > result) break;				//시간 단축 위해 사용
		int dir = order[t];
		out = 0;		//0: 둘다 안나감, 1: 하나만 나감, 2: 둘다 나감
		n1x = c1x + dx[dir];
		n1y = c1y + dy[dir];
		if (n1x >= 0 && n1y >= 0 && n1x < col && n1y < row) {
			if (arr[n1y][n1x] == '.') {
				c1x = n1x;
				c1y = n1y;
			}
		}
		else
			out++;
		n2x = c2x + dx[dir];
		n2y = c2y + dy[dir];
		if (n2x >= 0 && n2y >= 0 && n2x < col && n2y < row) {
			if (arr[n2y][n2x] == '.') {
				c2x = n2x;
				c2y = n2y;
			}
		}
		else
			out++;
		if (out == 0) continue;
		else if (out == 1) {
			t_result = t + 1;
			break;
		}
		else if (out == 2) 	break;		//더 이상 진행 불가
		
	}
	if (out==1) 
		result = min(result, t_result);	
}

void dfs(int cnt) {
	if(cnt == 10) {
		start();
		return;
	}
	for (int i = 0; i < 4; i++) {
		order.push_back(i);
		dfs(cnt + 1);
		order.pop_back();
	}
}

int main() {
	cin >> row >> col;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++) {
			cin >> arr[i][j];
			if (arr[i][j] == 'o') {
				arr[i][j] = '.';
				tmp.x = j;
				tmp.y = i;
				if (coin[0].empty())
					coin[0].push_back(tmp);
				else
					coin[1].push_back(tmp);
			}
		}
	dfs(0);
	if (result == 11) result = -1;
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2623] 음악프로그램 (C++)  (0) 2020.03.12
[백준 6118] 숨바꼭질 (C++)  (0) 2020.03.12
[백준 11578] 팀원 모집 (C++)  (0) 2020.03.11
[백준 1068] 트리 (C++)  (0) 2020.03.11
[백준 15989] 1,2,3 더하기 4 (C++)  (0) 2020.03.11
Comments