본문 바로가기
대학교/2.데이터구조

하노이타워(그래픽)

by Jcoder 2017. 4. 21.

소스 >

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


 

hanoi_2.c



'대학교 > 2.데이터구조' 카테고리의 다른 글

• Employee  (0) 2017.04.21
데이터구조 소스  (0) 2017.04.21
배열을 이용한 리스트의 구현  (0) 2017.04.21