질문
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번째 답변
마지막은 상상으로
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이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.
최근 공지사항이 없습니다.