< 소스 >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <stdio.h> #include <string.h> #define HEIGHT 5 // 탑의 높이를 HEIGHT으로 정함 void HanoiTowerMove(int num, char *from, char *by, char *to); char *A[HEIGHT+1] = { "55555", " 4444", " 333", " 22", " 1" }; // from으로 사용될 A char *B[HEIGHT+1] = { "\0" }; // by로 사용될 B char *C[HEIGHT+1] = { "\0" }; // to로 사용될 C int main(void) { int i; for (i = HEIGHT-1; i >= 0; i--) // 초기 배열의 입력 된 값을 출력 printf(" %s %s %s\n", A[i], B[i], C[i]); printf("-----------------------------------------\n"); printf(" A B C\n"); // 각 기둥을 출력 printf("-----------------------------------------\n"); HanoiTowerMove(HEIGHT, 'A', 'B', 'C'); // hanoi_tower의 재귀 함수 호출 return 0; } void HanoiTowerMove(int num, char *from, char *by, char *to) //하노이 타워 구현 { int i; if (num == 1) { to[strlen(to)] = from[strlen(from) - 1]; // from의 마지막블록을 to마지막으로 이동 from[strlen(from) - 1] = '\0'; // from의 마지막꺼에 null 대입(원본을 삭제해야 이동한 것처럼 보이기 때문) for (i = HEIGHT - 1; i >= 0; i--) // 각 배열의 값 출력 printf(" %s %s %s\n", A[i], B[i], C[i]); printf("-----------------------------------------\n"); printf(" A B C\n"); // 각 기둥을 출력 printf("-----------------------------------------\n"); printf("원반1을 %c에서 %c로 이동 \n", *from, *to); } else { HanoiTowerMove(num - 1, from, to, by); to[strlen(to)] = from[strlen(from) - 1]; // from의 마지막블록을 to마지막으로 이동 from[strlen(from) - 1] = '\0'; // from의 마지막꺼에 null 대입 for (i = HEIGHT - 1; i >= 0; i--) // 각 배열의 값 출력 printf(" %s %s %s\n", A[i], B[i], C[i]); printf("-----------------------------------------\n"); printf(" A B C\n"); printf("-----------------------------------------\n"); printf("원반%d을(를) %c에서 %c로 이동 \n", num, *from, *to); HanoiTowerMove(num - 1, by, from, to); // 각 기둥을 출력 } } | cs |
< 실행결과 >
오류..
< 참고 >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 1: #include <stdio.h> 2: #include <string.h> 3: #define HEIGHT 6 // 탑의 높이를 HEIGHT으로 정함 (상수화) 4: 5: char A[HEIGHT+1] = {'6', '5', '4', '3', '2', '1'}; // from으로 사용될 A 6: char B[HEIGHT+1] = {'\0'}; // temp로 사용될 B 7: char C[HEIGHT+1] = {'\0'}; // to로 사용될 C 8: 9: void hanoi_tower(int n, char *from, char *tmp, char *to) //하노이 타워 구현 10: { 11: int i; 12: 13: if(n == 1) 14: { 15: to[strlen(to)] = from[strlen(from)-1]; // from의 마지막블록을 to마지막으로 이동 16: from[strlen(from)-1] = '\0'; // from의 마지막꺼에 null 대입(원본을 삭제해야 이동한 것처럼 보이기 때문) 17: 18: for(i = HEIGHT - 1; i >= 0; i--) // 각 배열의 값 출력 19: printf("%c %c %c \n", A[i] , B[i] , C[i]); 20: printf("A B C\n"); // 각 기둥을 출력 21: } 22: 23: else 24: { 25: hanoi_tower(n-1, from, to, tmp); 26: 27: to[strlen(to)] = from[strlen(from)-1]; // from의 마지막블록을 to마지막으로 이동 28: from[strlen(from)-1] = '\0'; // from의 마지막꺼에 null 대입 29: 30: for(i = HEIGHT - 1; i >= 0; i--) // 각 배열의 값 출력 31: printf("%c %c %c \n", A[i] , B[i] , C[i]); 32: printf("A B C\n\n"); 33: 34: hanoi_tower(n-1, tmp, from, to); // 각 기둥을 출력 35: } 36: } 37: 38: int main(void) 39: { 40: int i; // index변수 선언 41: 42: for(i = HEIGHT; i >= 0; i--) // 초기 배열의 입력 된 값을 출력 43: printf("%c %c %c\n", A[i], B[i], C[i]); 44: printf("A B C\n"); // 각 기둥을 출력 45: 46: hanoi_tower(HEIGHT, A, B, C); // hanoi_tower의 재귀 함수 호출 47: getch(); 48: return 0; 49: } | cs |
'대학교 > 2.데이터구조' 카테고리의 다른 글
• Employee (0) | 2017.04.21 |
---|---|
데이터구조 소스 (0) | 2017.04.21 |
배열을 이용한 리스트의 구현 (0) | 2017.04.21 |