Coding Test/Baekjoon

[백준] 16197번 - 두 동전 / C++

peachh 2021. 2. 3. 22:22
728x90

문제

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈칸에는 동전이 하나씩 놓여 있고, 두 동전의 위치는 다르다.

버튼은 "왼쪽", "오른쪽", "위", "아래"와 같이 4가지가 있다. 버튼을 누르면 두 동전이 버튼에 쓰여 있는 방향으로 동시에 이동하게 된다.

  • 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다.
  • 동전이 이동하려는 방향에 칸이 없으면 동전은 보드 바깥으로 떨어진다.
  • 그 외의 경우에는 이동하려는 방향으로 한 칸 이동한다.이동하려는 칸에 동전이 있는 경우에도 한 칸 이동한다.

두 동전 중 하나만 보드에서 떨어뜨리기 위해 버튼을 최소 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 20)

둘째 줄부터 N개의 줄에는 보드의 상태가 주어진다.

  • o: 동전
  • .: 빈 칸
  • #: 벽

동전의 개수는 항상 2개이다.

 

출력

첫째 줄에 두 동전 중 하나만 보드에서 떨어뜨리기 위해 눌러야 하는 버튼의 최소 횟수를 출력한다. 만약, 두 동전을 떨어뜨릴 수 없거나, 버튼을 10번보다 많이 눌러야 한다면, -1을 출력한다.

 

코드

#include <iostream>

using namespace std;

int N;
int M;
bool board[21][21];		// 0: 칸, 1: 벽
int dn[] = {-1, 1, 0, 0};	// 0: UP, 1: DOWN, 2: LEFT, 3: RIGHT
int dm[] = {0, 0, -1, 1};	// 0: UP, 1: DOWN, 2: LEFT, 3: RIGHT
int answer = 11;

// 동전이 보드 위에 있는지 확인
bool is_on(int y, int x)
{
	if (y < 1 || y > N || x < 1 || x > M)
		return false;
	return true;
}

void dfs(int cnt, int y1, int x1, int y2, int x2)
{
	int i;
	int dy1, dx1, dy2, dx2;

	if (cnt > 10)
		return;
        
	// 두 동전 중 하나만 보드 위에 있는 경우
	if (is_on(y1, x1) != is_on(y2, x2))
	{
		answer = min(answer, cnt);
		return;
	}
    
	for (i = 0; i < 4; i++)
	{
		dy1 = y1 + dn[i];
		dx1 = x1 + dm[i];
		dy2 = y2 + dn[i];
		dx2 = x2 + dm[i];
        
		// 두 동전 모두 떨어진 경우
		if (!(is_on(dy1, dx1) || is_on(dy2, dx2)))
			continue;
        
		// 다음 위치가 벽이면 기존 위치 유지
		if (is_on(dy1, dx1) && board[dy1][dx1])
		{
			dy1 = y1;
			dx1 = x1;
		}
		if (is_on(dy2, dx2) && board[dy2][dx2])
		{
			dy2 = y2;
			dx2 = x2;
		}
        
		dfs(cnt + 1, dy1, dx1, dy2, dx2);
	}
}

int main()
{
	int i, j, k = 0;
	int c[2][2];
	string s;

	cin >> N >> M;
	for (i = 1; i <= N; i++)
	{
		cin >> s;
		for (j = 0; j < M; j++)
		{
			if (s[j] == '#')
			{
				board[i][j + 1] = 1;
				continue;
			}
			if (s[j] == 'o')
			{
				c[k][0] = i;
				c[k][1] = j + 1;
				k++;
			}
			board[i][j + 1] = 0;	
		}
		s.clear();
	}
	dfs(0, c[0][0], c[0][1], c[1][0], c[1][1]);
	if (answer > 10)
		answer = -1;
	cout << answer << endl;
	return 0;
}

 

링크

 

16197번: 두 동전

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,

www.acmicpc.net

 

inbdni/Baekjoon

Contribute to inbdni/Baekjoon development by creating an account on GitHub.

github.com

 

728x90