• 締切済み

ハノイの塔のチェック関数

ユニックス等のシステムコールを使ったハノイの塔を検査するプログラムです。質問したいのは円盤数、つまり塔の枚数が30枚で実行すると、チェックします。チェックされていいのですが20枚の時はされません。 なぜされるのかをおしえてください。 チェックされる条件は円盤番号が2回以上現れる。 0以外の番号の間には0がくるです。 チェック関数を抜き出すと void *Check(void *arg){ int i,nchecks=0; while(sw) { sleep(1); nchecks++; for(i=0;i<ndisks;i++) Z[i]=0; for(i=0;i<ndisks;i++){ if (A[i]!=0) { if (Z[A[i]-1]!=0) { fprintf(stderr,"Inconsistent(1)!!! (Tower-A Tries=%d)(i=%d)\n",nchecks,i); break;} Z[A[i]-1]=1; } if (B[i]!=0) { if (Z[B[i]-1]!=0) { fprintf(stderr,"Inconsistent(2)!!! (Tower-B Tries=%d)(i=%d)\n",nchecks,i); break;} Z[B[i]-1]=1; } if (C[i]!=0) { if (Z[C[i]-1]!=0) { fprintf(stderr,"Inconsistent(3)!!! (Tower-C Tries=%d)(i=%d)\n",nchecks,i); break;} Z[C[i]-1]=1; } } for(i=0;i<ndisks;i++) { if (Z[i]==0) { fprintf(stderr,"Inconsistent(4)!!! (Final Tries=%d)(i=%d)\n",nchecks,i); break;} } } }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

せめて「コンパイルできる完全なプログラムを出そう」とか「変数の意味を全部説明しよう」とか思わなかった? あと, 「20枚のときにチェックされなかった」というのは, どうしてそう判断したの? 「チェックする」といっても普通は通じないし, 返り値の型が void * なのも理解できないところだけど... というか, そもそも日本語もあやしいなぁ....