第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話のコードを改良して上のように傾向が予想できないようにしてください。
それから②唯一解または複数解の問題も解決してください。