물의 양이 항상 같으므로
a->b , a->c
b->c , c->a
c->b , b->a
이 6가지 경우로 물을 옮기는 것만 생각해주면 된다.
또한, 방문 검사는 a, b, c 각 물의 양에 따라 체크하기 위해 3차원 배열을 이용했다.
from collections import deque
asize, bsize, csize = map(int, input().split())
q = deque()
q.append((0, 0, csize))
check = [[[False] * 201 for _ in range(201)] for _ in range(201)]
result = []
def move(i, _a, _b, _c):
if i == 0: # a -> b
empty = bsize - _b
if empty >= _a:
_b += _a
_a = 0
else:
_a -= empty
_b = bsize
elif i == 1: # a -> c
empty = csize - _c
if empty >= _a:
_c += _a
_a = 0
else:
_a -= empty
_c = csize
elif i == 2: # b -> c
empty = csize - _c
if empty >= _b:
_c += _b
_b = 0
else:
_b -= empty
_c = csize
elif i == 3: # c -> a
empty = asize - _a
if empty >= _c:
_a += _c
_c = 0
else:
_c -= empty
_a = asize
elif i == 4: # c -> b
empty = bsize - _b
if empty >= _c:
_b += _c
_c = 0
else:
_c -= empty
_b = bsize
elif i == 5: # b -> a
empty = asize - _a
if empty >= _b:
_a += _b
_b = 0
else:
_b -= empty
_a = asize
return _a, _b, _c
c_check = [False] * 201
while q:
a, b, c = q.popleft()
if a == 0 and not c_check[c]:
c_check[c] = True
result.append(c)
for index in range(6):
i, j, k = move(index, a, b, c)
if not check[i][j][k]:
check[i][j][k] = True
q.append((i, j, k))
result.sort()
for i in result:
print(i, end=" ")
C
의 물통을 표시하지 않고 A
와 B
두개의 물통으로만 표현했다.
현재 C의 양은 C의 물통 크기에서 a, b를 뺀 양이라고 볼 수 있다.
...
water = min(x, b-y) # 현재a의 물 양과 B물통의 빈공간을 비교해 더 작은 것을 선택한다.
pour(x-water, y+water) # 선택 값을 빼고 더한다.
water = min(x, c-z)
pour(x-water, y)
water = min(y, a-x)
pour(x+water, y-water)
water = min(y, c-z)
pour(x, y-water)
water = min(z, a-x)
pour(x+water, y)
water = min(z, b-y)
pour(x, y+water)
...
출처: https://rebas.kr/769 [PROJECT REBAS]
rebas님 블로그