第6講 残された課題の解消とマルチスレッド化
第1話 残された課題
本当はここでマルチスレッド化する予定でしたが、

まだ大きな問題が3つほど残されています。
①実行結果が規則的でランダムになっていない
②唯一解の証明がされていない
③複数解ときは探索を継続して唯一解が見つかったら表示させる

void f(int a, int s) {//ヒント数0の数独を解く関数
  int y = s / 9; //縦座標
  int x = s % 9; //横座標
  unsigned u = (unsigned)time(NULL);
  srand(2); //シード整数値を現在の時刻から取得 後に2はuに戻す
  int ii = rand() % 9; //始まりをランダムにする
  for (int i = 0; i < n; i++) {
    
sudoku[a][y][x] = (i + ii) % n + 1; //2次元配列に1から9までの整数を入力
    //現時点ではなぜかうまくいっていないが後に原因を解明予定
    //例えば、ii = 5でi = 0ならば(5 + 0) % 9 + 1の計算から6になるはずなのに現実は1になっている
    //この問題は後に改善する

注釈文に書いてある通り始まりはランダムになるはずなのですが、

解答を見れば一目瞭然の通りランダムになっていません。

例えば、ii = 5なら5,6,7,8,9,1,2,3,4

と動くはずでした。

でも原因は大変簡単なものでした。

void f(int a, int s) {//ヒント数0の数独を解く関数
  int y = s / 9; //縦座標
  int x = s % 9; //横座標
  unsigned u = (unsigned)time(NULL);
  srand(2); //シード整数値を現在の時刻から取得 後に2はuに戻す
  int ii = rand() % 9; //始まりをランダムにする
  for (int i = 0; i < n; i++) {
    sudoku[a][y][x] = (i + ii) % n + 1; //2次元配列に1から9までの整数を入力
    //現時点ではなぜかうまくいっていないが後に原因を解明予定
    //例えば、ii = 5でi = 0ならば(5 + 0) % 9 + 1の計算から6になるはずなのに現実は1になっている
    //この問題は後に改善する

そうです。

2 を u に戻すの忘れていただけです(笑)。

皆さん私のアホさ加減を笑ってください(
(ノω·`o)ショボー)。

ごめんなさい。

ところが、その問題を解消しても

上と下を比べたとき、明らかな違いがあります。
上の1個目


1行目

7,8,9,1,2,3,4,5,6は、

1,2,3,4,5,6,7,8,9の7,8,9を左にもって行っただけです。

何題か解くと傾向に気が付いてしまうでしょう。

このソフトの偏りに気が付いてしまうでしょう。

しかし、下の1個目は

かなりランダムに並んでいます。

これなら問題の傾向がありませんから、

毎回異なる問題になり喜んで解いてくれるでしょう。

皆さん第4講第9話のコードを改良して上のように傾向が予想できないようにしてください。

それから②唯一解または複数解の問題も解決してください。


第5講第10話へ 第2話へ

トップへ