/********************************** * (C) 2006 Hirohisa AMAN * 練習問題 2 (第 7 回) **********************************/ #include /* スタックサイズ */ #define SIZE 1024 struct data { int n; /* 枚数 */ char start; /* 開始 */ char goal; /* 目的 */ char work; /* 作業用 */ }; int sp = -1; struct data stack[SIZE]; void push(struct data x){ if ( sp+1 == SIZE ){ fprintf(stderr, "スタックオーバーフロー\n"); exit(1); } stack[++sp] = x; } struct data pop(void){ if ( sp == -1 ){ fprintf(stderr, "スタックアンダーフロー\n"); exit(1); } return stack[sp--]; } int main(void){ struct data x, y; /* 処理データ */ int n; /* 円盤の枚数 */ printf("円盤の枚数 = ? "); scanf("%d", &n); /* 初期設定 */ x.n = n; x.start = 'A'; x.goal = 'C'; x.work = 'B'; push(x); while ( sp != -1 ){ x = pop(); if ( x.n > 1 ){ /* n-1 枚を作業域から目的の柱へ移動 */ y.n = x.n - 1; y.start = x.work; y.goal = x.goal; y.work = x.start; push(y); /* 1 枚を目的の柱へ移動 */ y.n = 1; y.start = x.start; y.goal = x.goal; push(y); /* n-1 枚を作業域へ移動 */ y.n = x.n - 1; y.start = x.start; y.goal = x.work; y.work = x.goal; push(y); } else{ printf("%c --> %c\n", x.start, x.goal); } } return 0; }