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

하노이탑, 배열로 보여주기

바로이순간 2012. 3. 29. 09:20

#include <stdio.h>


int a[5]={4,4,3,2,1};  // a[0] 는 stack a 의 top을 나타낸다

int b[5]={0,};         // b[0] stack b top

int c[5]={0,};         // c[0] stack c top

int *z[3]={a,b,c};


void show() {

  int i;

  printf("A: ");for(i=1;i<5;i++) printf("%d ",a[i]); printf(" ");

  printf("B: ");for(i=1;i<5;i++) printf("%d ",b[i]); printf(" ");

  printf("C: ");for(i=1;i<5;i++) printf("%d ",c[i]); printf("\n");

}


void move(int disk, char source, char dest) {

  int s=source-'A'; 

  int d=dest-'A';

  int x=z[s][z[s][0]]; z[s][z[s][0]--]=0;

  //if(x==disk) printf("ok ");

  z[d][++(z[d][0])]=x;

  show();  

}


void hanoi(int n, char a, char b, char c){

  if(n==1) move(1,a,c);   //printf("원판 1을 %c 에서 %c 으로 옮긴다.\n", a,c);

  else {

    hanoi(n-1, a,c,b);

    move(n,a,c);          //printf("원판 %d 을 %c에서 %c으로 옮긴다.\n", n,a,c);

    hanoi(n-1,b,a,c);

  }

}

 

int main() {

  show();

  hanoi(4, 'A', 'B', 'C');

 

  return 0; 

}