#include <stdio.h>
int main() {
// 1은 옮겨야할 디스크를 나타내고,
// 0은 옮겨진 디스크를 나타낸다. (바뀔 수 있다.)
int disk[20]={1,};
// 각 디스크의 위치
char loc[20]={'A',};
// 현재 디스크의 원위치
char pos;
int i, n;
// loc과 disk초기화
for(i=0;i<20;i+=1) { disk[i]=1; loc[i]='A'; }
// 하노이 탑의 높이, 최대 높이는 20까지
printf("n= ");
scanf("%d", &n);
// 메인 루프 시작
// i+1은 디스크번호를 나타낸다.
// 처음에는 1번 디스크부터 움직인다.
i=0;
while(1) {
// 아래의 디스크들이 모두 옮겨졌다면
// 그 다음 디스크를 옮겨야 한다.
while(i<n&&disk[i]==0) { printf("...."); i+=1;}
// 만약 다음 디스크가 n+1이라면 모두 끝난것이다.
if(i==n) break;
// 현재 디스크의 위치
pos=loc[i];
// 디스크는 i+n이 짝수이냐 홀수이냐에 따라서 오른쪽 또는 왼쪽으로 이동한다.
// i+n이 홀수: 왼쪽으로 한칸 A=>C B=>A C=>B 이동한다.
// i+n이 짝수: 오른쪽으로 한칸 A=>B B=>C C=>A 이동한다.
loc[i]=(loc[i]-'A'+1+(i+n)%2)%3+'A';
printf("move [%d] from %c to %c\n", i+1, pos, loc[i]);
// 디스크를 이동하고 나면 0으로 표시하고, 아래로 이동한다.
disk[i]=0; i-=1;
// 아래의 0으로 표시된 디스크를 모두 1로 표시한다.
// 디스크2를 옮기고 나면 다시 디스크1을 옮겨야 한다.
// 디스크3을 옮기고 나면 다시 디스크1,2를 옮겨야 한다.
while(i>=0&&disk[i]==0) { disk[i]=1; i-=1; }
if(i<0) { i=0; }
}
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
maximum sum subarray(배열의 최대합 구간) (0) | 2016.04.08 |
---|---|
quick sort (0) | 2015.10.01 |
Microsoft Visual Studio 2010 Express Registration Key (0) | 2015.07.16 |
프로그램 모음 (0) | 2015.05.17 |
disjoint set union 프로그래밍 (0) | 2015.05.02 |