質問: true) { // チェックok -> return return ['result' => true, 'value' => $p]; } else { // チェックNG -> paramを減らしてregression if ($param) { return $this->__put($d, $nx, $ny, $param); } else { // paramがないと き // 最後まで値が入らなかったので、重複チェックで引っかかったx,yをreturnする return ['result' => false, 'value' => $p, 'err_x' => $check['x'], 'err_y' => $check['y']]; } } } } ```
回答: あたりをつけて、簡単な検証しかしてませんので参考までに... 手順は 1. 基本形の生成 2. シャッフルする です。 1. は、 python ですが、以下のコードで 水平方向昇順なシンプルな数独が生成できます。 ``` def create(num=3): num2 = num * num g = [[0]*num2 for i in range(num2)] for y in range(num2): yy = (y * num) % num2 + int(y / num) for x in range(num2): g[x][yy] = (num2 - y + x) % num2 + 1 ``` 9x9(num=3)だと `a b c d e f g h i 1 2 3 4 5 6 7 8 9 7 8 9 1 2 3 4 5 6 4 5 6 7 8 9 1 2 3 9 1 2 3 4 5 6 7 8 6 7 8 9 1 2 3 4 5 3 4 5 6 7 8 9 1 2 8 9 1 2 3 4 5 6 7 5 6 7 8 9 1 2 3 4 2 3 4 5 6 7 8 9 1` って感じです。(a-zは 2で使うので付与してます) 2. シャッフル 1.で生成したものを数独を壊さないようにシャッフルします。 下記条件を満たせば数独は壊れません。 * a列 と、b(or c)列の入れ変え * a,b,c列と d,e,f(or g,h,i)列の入れ変え これは、行でも成り立ちますので、計4つのシャッフルを十分な回数実行すれば、 ランダムな数独になると思います。