$O(2^n)$
f(x,y,k)를 호출하면 1~k번째 원판을 x위치에서 y위치로 옮기는 일을 수행한다고 하자.
f(x,y,k)는 다음 행동과 같다.
x,y가 아닌 위치(1,2,3 중 하나)를 z(=6-x-y)라 하자.
1. 1~k-1번째 판을 x에서 z로 옮긴다. = f(x,z,k-1)
2. k번째 판을 x에서 y로 옯긴다.
3. 1~k-1번째 판을 z에서 y로 옮긴다. = f(x,y,k-1)
따라서 재귀호출을 이용해 간단히 구현할 수 있다.
n개 판을 이동시키는데 2^n-1번의 이동이 필요함은 수학적 귀납법으로 쉽게 증명할 수 있다.
-> 2^n-1 = 2^(n-1)-1 + 1 + 2^(n-1)-1
#include<cstdio> int n; void f(int x, int y, int z) { if (!z) return; f(x, 6 - x - y, z - 1); printf("%d %d\n", x, y); f(6 - x - y, y, z - 1); } int main() { scanf("%d", &n); printf("%d\n", (1 << n) - 1); f(1, 3, n); return 0; }
댓글 없음 :
댓글 쓰기