예제 입력 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 |