実現したいこと
- ハノイの塔を実行するプログラムをコーディングしたい。
前提
C言語でハノイの塔を実行するプログラムを書いています。
動作が目に見える形で出力されるインタラクティブなものを創っています。
発生している問題・エラーメッセージ
### start 0|6]5]4]3]2]1] 1| 2| ### move 0 to 1 0|6]5]4]3]2] 1|1] 2| ### verify: OK ### move 0 to 2 0|6]5]4]3] 1|1] 2|2] ### move 1 to 2 0|6]5]4]3] 1| 2|2]1] ### verify: OK ### verify: OK ### move 0 to 1 0|6]5]4] 1|3] 2|2]1] ### move 2 to 0 0|6]5]4]1] 1|3] 2|2] ### verify: FAILED 0|6]5]4]1] 1|3] 2|2]
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define N_TOWER 3 unsigned* tower[N_TOWER]; unsigned* top[N_TOWER]; unsigned n_input; unsigned n_steps = 0; void print_tower(unsigned i) { assert(0 <= i && i < N_TOWER); unsigned* p = tower[i]; printf("%d|", i); while (p != top[i]) { printf("%d]", *p); p++; } printf("\n"); } void print_towers() { int i; for (i = 0; i < N_TOWER; i++) { print_tower(i); } } void move(unsigned from, unsigned to) { printf("### move %d to %d\n", from, to); unsigned disk = *(--top[from]); *(top[to]++) = disk; n_steps++; print_towers(); } int verify_towers(unsigned* t0, unsigned* t1, unsigned* t2) { int j; for (j = 0; j < n_input - 1; j++) { //最大の高さのインデックス=(n_input-1) if (t0[j] < t0[j + 1] || t1[j] < t1[j + 1] || t2[j] < t2[j + 1]) { return 0; //ルールを無視している } } return 1; } void hanoi(unsigned n, unsigned cur_pos, unsigned dest_pos) { //current,destination assert(0 < n); assert(0 <= cur_pos && cur_pos < N_TOWER); assert(0 <= dest_pos && dest_pos < N_TOWER); if (n == 1) { move(cur_pos, dest_pos); } else { unsigned tmp_pos = 3 - cur_pos - dest_pos; //temporary、仮の保管場所 hanoi(n - 1, cur_pos, tmp_pos); move(cur_pos, dest_pos); hanoi(n - 1, tmp_pos, dest_pos); } if (verify_towers(tower[0], tower[1], tower[2]) && verify_towers(tower[0], tower[1], tower[2]) && verify_towers(tower[0], tower[1], tower[2])) { puts("### verify: OK"); } else { puts("### verify: FAILED"); print_towers(); exit(EXIT_FAILURE); } } int main(int argc, char** argv) { int i; assert(argc == 2); n_input = atoi(argv[1]); assert(n_input > 0); for (i = 0; i < N_TOWER; i++) { tower[i] = malloc(n_input * sizeof(unsigned)); if (tower[i] == NULL) exit(EXIT_FAILURE); top[i] = tower[i]; } for (i = 0; i < n_input; i++) { *top[0] = n_input - i; top[0]++; } puts("### start"); print_towers(); hanoi(n_input, 0, 2); printf("### %d steps to complete\n", n_steps); return 0; }
試したこと
verify_towers関数を確認してみましたが、エラーとなる原因を見つけることができませんでした。
補足情報(FW/ツールのバージョンなど)
Linuxの端末
C#とC言語は別の言語となりますので、C#のタグは外してください。
回答1件
あなたの回答
tips
プレビュー