いろいろありますけど(講義編)

大学であったことなどを中心に書いていきます。統計学とC言語の講義が主です。

ハノイの塔 第2回(Cプログラム)

2005-07-24 19:00:16 | アルゴリズム
一応作ったのでプログラムをあげておきます。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");
}



続きは次回に

最新の画像もっと見る