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












  1. 垂直方向のチェックを行う。


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


    実際に置かれている数値を集合配列より減算すると
    垂直方向の減算のみだと図のように
    [ 2,4,5,7,8] になる。



















  2. コード
    {***************************************************
    **  垂直方向 チェック
    **        []空集合は False で返す。
    **        要素一個は マス目配列更新 して再帰処理
    ****************************************************}
    function TForm1.vertical_Check(lct : TPoint):boolean;
    var
      i,x,y : integer;
    begin
      x := lct.X;
      y := lct.Y;
      result := True;
      for i := low(KnAry) to high(KnAry) do
        if i = x then
          continue
        else
          if DArray[x][y] in KnAry[i][y] then
            begin
              KnAry[i][y] := KnAry[i][y] - [DArray[x][y]];
              //[] 空集合
              if ( KnAry[i][y] = []) then
                begin
                  memo1.Lines.Add('V 空 FALSE');
                  result := False;
                  exit;
                end;
          end;
    end;
    
    
    
    
    
    引数 lct は実際に数値が入っている
    マス目の座標
    
    
    
    
     集合配列の垂直方向
    
    
    
     マス目の数値が集合要素に含まれていたら
    
     集合要素からマス目の数値を減算する。
    
     結果 [ ] 空集合になったら
     中止。
      矛盾あり
       デバッグ用で memo1 に出力