一応作ったのでプログラムをあげておきます。C言語です。時間があればJavaに直してアプレットとして動くようにします。
続きは次回に
#include <stdio.h> #define PEGS 3 #define MAX 30 int hanoi(int, int, int, int); void move(int, int); void initPeg(int); void printPeg(void); int peg[PEGS][MAX + 1]; int main(void) { int size, count; fprintf(stderr, "ハノイの塔の大きさは(1-%d):", MAX); scanf("%d", &size); initPeg(size); printf("大きさ%dのハノイの塔の移動方法は以下の通りです。\n---\n"); printPeg(); count = hanoi3(size, 0, 2, 1); printf("---\n以上%d手です。\n", count); return(0); } int hanoi3(int n, int from, int to, int other) { int count = 1; if(n == 1) { move(from, to); } else { count += hanoi3(n - 1, from, other, to); move(from, to); count += hanoi3(n - 1, other, to, from); } return(count); } void move(int from, int to) { int n = peg[from][peg[from][0]]; printf("%04dを%dから%dへ動かす\n", n, from + 1, to + 1); peg[to][++peg[to][0]] = n; peg[from][peg[from][0]--] = 0; printPeg(); } void initPeg(int n) { int i, j; for(j = 0; j <= n; j ++) { peg[0][j] = n - j + 1; for(i = 1; i < PEGS; i ++) { peg[i][j] = 0; } } peg[0][0] = n; } void printPeg(void) { int i, j, max = 0; printf(" "); for(i = 0; i < PEGS; i++) { printf(" | "); if(max < peg[i][0]) { max = peg[i][0]; } } for(j = max; j > 0; j--) { printf("\n "); for(i = 0; i < PEGS; i++) { if(peg[i][j] == 0) { printf(" | "); } else { printf("%05d ", peg[i][j]); } } } printf("\n "); for(i = 0; i < PEGS; i++) { printf("--%c-- ", (char)(0x41 + i)); } printf("\n\n"); }
続きは次回に