NAVER

질문 c언어 하노이탑 질문
비공개 조회수 1,196 작성일2019.02.16
#include <stdio.h>
void hanoi_top(int n, char from, char tmp, char to);
int main(void) {
int topnumber;
printf("총 몇개의 하노이 탑? : ");
scanf("%d", &topnumber);
hanoi_top(topnumber, 'A', 'B', 'C'); //하노이탑 원판수와 A,B,C 기둥을 지정
return 0;
}
void hanoi_top(int n, char from, char by, char to)
{
if (n == 1) {
printf("원판 1을 %c에서 %c로 옮겨요.\n", from, to); 
}
else {
hanoi_top(n - 1, from, to, by);
printf("원판 %d을 %c에서 %c로 옮겨요.\n", n, from, to); // 
hanoi_top(n - 1, by, from, to);
}
}
하노이탑 프로그램인데요, 이 프로그램의 흐름을 모르겠습니다.
흐름을 알려주세요.
프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
Science Y
바람신
C, C++, 동영상소프트웨어 57위 분야에서 활동
본인 입력 포함 정보
#include <stdio.h>
void hanoi_top(int n, char from, char tmp, char to);

int main(void) { // (1) 흐름의 시작
    int topnumber; // (2) 변수 topnumber을 선언합니다. 선언은 이 변수를 사용하겠다라는 것을 컴파일러에게 알려주는 것을 의미. (동시에 저장 공간인 메모리를 할당받습니다)
    printf("총 몇개의 하노이 탑? : "); // (3) 글자를 출력함
    scanf("%d", &topnumber); // (4) 정수를 입력받고 변수 topnumber에 저장합니다
    hanoi_top(topnumber, 'A', 'B', 'C'); //하노이탑 원판수와 A,B,C 기둥을 지정
    // (5) 함수 hanoi_top( )를 호출합니다. 호출과 동시에 인수를 함수에 전달합니다
    return 0;
}

void hanoi_top(int n, char from, char by, char to) // (6) 메인함수에서 호출하면 시작합니다
{
    if (n == 1) {  // (7a) 만약 인수 n이 1이면 if문을 실행합니다. 
        printf("원판 1을 %c에서 %c로 옮겨요.\n", from, to); // (7b) from과 to를 대입하여 문자열을 출력 
    }
    else { // (8a) - (7a)가 거짓이면 실행됩니다 
        hanoi_top(n - 1, from, to, by); // (8b) n을 1 감소시킨 값을 hanoi-top()의 인수로 주어 함수를 실행합니다 
        printf("원판 %d을 %c에서 %c로 옮겨요.\n", n, from, to); // (8c) 문자열 출력 
        hanoi_top(n - 1, by, from, to); // (8d) n을 1 감소시킨 값을 hanoi-top()의 인수로 주어 함수를 실행합니다 
    } 
} // (9) 함수 종료


만약 topnumber이 3이라면 작동 순서는 이렇습니다
(1)~(4) 
(n이 {'3,2,1',   '2,1',   '1'},   {'2,1',   '1'}로 변함)



(5,6, n==3으로 함수를 호출함) (7a, n==3이므로 false) (8a) 
(8b, 6, n==2로 함수 시작) (7a, n==2이므로 false) (8a)
(8b, 6, n==1로 함수 시작) (7a, n==1이므로 true) (7b, "원판 1을 %c에서 %c로 옮겨요" 출력) (9)
(8c, "원판 %d을 %c에서 %c로 옮겨요" 출력)

(8d, 6, n==2의 함수가 작동) (7a, n==2이므로 false) (8a) 
(8b, 6, n==1로 함수 시작) (7a, n==1이므로 true) (7b, "원판 1을 %c에서 %c로 옮겨요" 출력) (9)
(8c, "원판 %d을 %c에서 %c로 옮겨요" 출력)

(8d, 6, n==1의 함수가 작동) (7a, n==1이므로 true) (7b, "원판 1을 %c에서 %c로 옮겨요" 출력) (9) (9) (9)

(8c, "원판 %d을 %c에서 %c로 옮겨요" 출력)
(8d, 6, n==2의 함수가 작동) (7a, n==2이므로 false) (8a) 
(8b, 6, n==1로 함수 시작) (7a, n==1이므로 true) (7b, "원판 1을 %c에서 %c로 옮겨요" 출력) (9)
(8c,  "원판 %d을 %c에서 %c로 옮겨요" 출력)

(8d, 6, n==1로 함수 시작) (7a, n==1이므로 true) (7b, "원판 1을 %c에서 %c로 옮겨요" 출력) (9) (9)


코드 내용은 이렇고...
탑에 있는 각각의 원판의 움직임은 원판이 3개일 때를 생각하시면 이해하기 쉽습니다
 A B C
 □□■□□
 □■■■□
 ■■■■■
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □■■■□
 ■■■■■
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□■□□
 □□□□□
 □□□□□
 ■■■■■
 □□□□□
 □□□□□
 □■■■□
 □□□□□
 □□□□□
 □□■□□
 □□□□□
 □□□□□
 ■■■■■
 □□□□□
 □□■□□
 □■■■□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □□■□□
 □■■■□
 □□□□□
 □□□□□
 ■■■■■
 □□□□□
 □□□□□
 □□■□□
 □□□□□
 □□□□□
 □■■■□
 □□□□□
 □□□□□
 ■■■■■
 □□□□□
 □□□□□
 □□■□□
 □□□□□
 □□□□□
 □□□□□
 □□□□□
 □■■■□
 ■■■■■
마지막은 상상으로


2019.02.16.

  • 채택

    질문자가 채택한 답변입니다.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.