ナンバープレィス・数独について
「数独」・ナンバープレイスをテーマにしてプログラムで遊ぶ












  1. 3*3 の小ブロックエリアのチェックを行う。


    水平・垂直と同じで
    集合配列の初期値は
    すべて配置可能なので
    [ 1,2,3,4,5,6,7,8,9]
    ということになる。


    実際に置かれている数値を集合配列より減算すると
    小ブロックエリアの減算のみだと図のように
    [ 2,4,5,7,8] になる。

    これに水平・垂直のチェックをすればかなり範囲が狭くなる。









  2. コード
    {*************************************************
    **  小マス目の水平・水直方向 を調べる
    **   lct:TPointの属する小ブロック内
    **
    **************************************************}
    function TForm1.small_area_Check(lct:TPoint):boolean;
    var
      i,j,x,y : integer;
      s_i,s_j : integer;
      msg : string;
    begin
      x := lct.X;
      y := lct.Y;
      s_i := ( x div 3 ) * 3;
      s_j := ( y div 3 ) * 3;
      result := True;
      for i := s_i to s_i + 2  do
        for j := s_j to s_j + 2 do
          begin
            if Darray[i,j] <> 0 then
              continue;
    
            if DArray[x][y] in KnAry[i][j] then
              KnAry[i][j] := KnAry[i][j]
                              - [ DArray[x][y]];
            if KnAry[i,j] = [] then
              begin
                result := False;
                exit;
              end;
           end;
    end;
    
    ( x div 3 ) * 3
    ( y div 3 ) * 3 として対象となる小マス目
    の位置を算出する。
    0 -- 0
    1 -- 0 
    2 -- 0    このように対象となる小マス目の
    3 -- 3  捜査開始位置を算出する。
    4 -- 3
    5 -- 3
    6 -- 6
    7 -- 6
    8 -- 6 
    
    
    引数 lct は実際に数値が入っている
    マス目の座標
    
     集合配列の検査範囲
    
    
    
     マス目の数値が集合要素に含まれていたら
    
     集合要素からマス目の数値を減算する。
    
     結果 [ ] 空集合になったら
     中止。
      矛盾あり