Algorithm/문제풀이

[BFS] 돌 그룹

lee308812 2019. 10. 15. 21:10

예제 입력 1

10 15 35

예제 출력 1

1

예제 입력 2

1 1 2

예제 출력 2

0

 

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

 

12886번: 돌 그룹

오늘 강호는 돌을 이용해 재미있는 게임을 하려고 한다. 먼저, 돌 세개는 그룹으로 나누어져 있으며 각각의 그룹에는 돌이 A, B, C개가 있다. 강호는 모든 그룹에 있는 돌의 개수를 같게 만들려고 한다. 강호는 돌을 단계별로 움직이며, 각 단계는 다음과 같이 이루어져 있다. 크기가 같지 않은 두 그룹을 고른다. 그 다음, 돌의 개수가 작은 쪽을 X, 큰 쪽을 Y라고 정한다. 그 다음, X에 있는 돌의 개수를 X+X개로, Y에 있는 돌의 개수를 Y-X개로

www.acmicpc.net

- 시간 복잡도 + 공간 복잡도를 줄이기 위해 A, B만 저장하고 C는 처음에 A+B+C를 sum에 저장해두고 sum - B - A로 구한다. 

- A + B + C가 3으로 나누어 떨어지지 않는다면 풀 수 없으므로 0을 출력한다.

#include <stdio.h>

const int MAX_COUNT = 1500;

int A, B, C;
int sum;
bool used[MAX_COUNT][MAX_COUNT];

void swap(int& A, int& B)
{
	int temp = A;
	A = B;
	B = temp;
}

bool go(int A, int B)
{
	int numbers[] = { A, B, sum - A - B };
	
	used[A][B] = true;
	
	if (numbers[0] == numbers[1] && numbers[1] == numbers[2])
	{
		return 1;
	}

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (numbers[i] < numbers[j])
			{
				int a = numbers[i] * 2;
				int b = numbers[j] - numbers[i];

				if (!used[a][b])
				{
					if (go(a, b) == 1) return 1;
				}
			}
		}
	}

	return 0;
}

int main(void)
{
	scanf("%d %d %d", &A, &B, &C);

	sum = A + B + C;

	if (sum % 3 != 0)
		printf("0\n");
	else
		printf("%d\n", go(A, B));

	return 0;
}

 

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[BFS ] 벽 부수고 이동하기 4  (0) 2019.10.16
[BFS] 벽 부수고 이동하기  (0) 2019.10.15
[BFS] 연구소  (0) 2019.10.14
[BFS] 데스 나이트  (0) 2019.10.14
[BFS] 뱀과 사다리 게임  (0) 2019.10.14