물통

두 물통의 용량과 목표로 하는 물의 양이 주어질 때, (0,0)에서 시작해 채우기, 비우기, 붓기로 목표 상태에 도달하는 최소 연산 수를 구하고 불가능하면 -1을 출력한다.

보통6BFS그래프수학정수론면접 대비아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

용량이 서로 다른 빈 물통 A와 B가 하나씩 있다. 두 물통에 물을 채우고 비우는 작업을 반복해서 목표한 양의 물이 담긴 상태를 만들려고 한다. 물통 말고는 물의 양을 정확히 잴 방법이 없고, 할 수 있는 작업은 다음 세 가지뿐이다.

  • F(x): 물통 x를 물로 가득 채운다. 채우기 전에 물통 x가 비어 있었는지는 상관없고, 다른 물통은 그대로 둔다.
  • E(x): 물통 x에 담긴 물을 모두 버린다. 다른 물통은 그대로 둔다.
  • M(x,y): 물통 x의 물을 물통 y에 붓는다. 물통 x에 남은 물의 양이 물통 y의 빈 공간보다 적거나 같으면 x의 물을 전부 y에 붓는다. 그보다 많으면 y가 가득 찰 때까지 붓고 나머지는 x에 남긴다.

표기 (p,q)(p,q)는 물통 A에 pp리터, 물통 B에 qq리터가 담긴 상태를 뜻한다.

예를 들어 물통 A와 B의 용량이 각각 2리터와 5리터라고 하자. 두 물통이 모두 빈 상태에서 시작해 A에 2리터, B에 4리터를 남기려면 다음 순서로 작업해서 8번 만에 목표 상태에 도달한다.

(0,0)(0,0)F(B)(0,5)(0,5)M(B,A)(2,3)(2,3)E(A)(0,3)(0,3)M(B,A)(2,1)(2,1)E(A)(0,1)(0,1)M(B,A)(1,0)(1,0)F(B)(1,5)(1,5)M(B,A)(2,4)(2,4)

작업 순서를 다음처럼 바꾸면 5번이면 충분하다.

(0,0)(0,0)F(A)(2,0)(2,0)M(A,B)(0,2)(0,2)F(A)(2,2)(2,2)M(A,B)(0,4)(0,4)F(A)(2,4)(2,4)

두 물통의 용량과 목표 상태가 주어질 때, 두 물통이 모두 빈 상태에서 시작해 목표 상태에 도달하는 최소 작업 수를 구하는 프로그램을 작성하시오.

입력

표준 입력 한 줄에 정수 aa, bb, cc, dd가 공백으로 구분되어 주어진다. aa는 물통 A의 용량, bb는 물통 B의 용량, cc는 목표 상태에서 물통 A에 남아야 하는 물의 양, dd는 목표 상태에서 물통 B에 남아야 하는 물의 양이다. 1a<1000001 \le a < 100000, a<b100000a < b \le 100000, 0ca0 \le c \le a, 0db0 \le d \le b이다.

출력

목표 상태에 도달하는 최소 작업 수를 표준 출력에 한 줄로 출력한다. 목표 상태에 도달하는 방법이 없으면 -1을 출력한다.