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

하노이탑의 움직임을 배열을 이용하여 보여주기.

바로이순간 2012. 4. 21. 14:26

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>


int size=0;

int a[11]={0,};         // a[0] 는 stack a 의 top을 나타낸다

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

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

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


void initialize() {

  int i;

  a[0]=size;

  for(i=1;i<size+1;++i) a[i]=size+1-i; 

}


void show() {

  int i;


  system("cls");

  printf("\n");

  for(i=0;i<size;++i) {

    printf("  ");

    if(a[size-i]) printf("%2d",a[size-i]); else printf("  "); printf("  ");

    if(b[size-i]) printf("%2d",b[size-i]); else printf("  "); printf("  ");

    if(c[size-i]) printf("%2d",c[size-i]); else printf("  "); printf("\n");

  }

  printf("  --- --- ---\n");

  printf("   A   B   C\n\n");

  getch();

}


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() {

  printf("크기: ");

  scanf("%d", &size);

  initialize();

  show();

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

 

  return 0; 

}