c·c++/c 프로그래밍

하노이탑 - 반복문사용

바로이순간 2015. 9. 20. 15:23

#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