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












  1. 集合要素のペアがあれば他の要素から減算出来る。


    左図の例では[1,3]の要素を持つ集合がある。
    そうするとこの二つのマス目は 1 か 3 しか置く事は
    出来ないことになる。
    つまりどちらかのマス目が1でもう一方は3ということになる。


    水平方向だけを考えると[1,3,6,8] という集合配列は ここから[1,3]を減算することが可能なので
    [1,3,6,8] - [1,3] = [6,8]になる。



    これも水平・垂直・小ブロックエリアについて同様のことがあてはまるわけである。











  2. コード
    {*********************************************
    **  H(orizon)V(ertical)S(mall) のペアの検査
    **   []空集合になれば False を返す。
    **    更新
    **********************************************}
    function TForm1.HVS_pare_Check():boolean;
    var
      i,j,cnt : integer;
    begin
      result := true;
      for i := low(KnAry) to high(KnAry) do
        for j := low(KnAry[i]) to high(KnAry[i]) do
          begin
            cnt := count_shugo(KnAry[i,j]);
            //memo1.Lines.Add(intToStr(cnt));
            if ( cnt = 2) and (DArray[i,j] = 0)  then
              begin
               if H_pare_check(point(i,j)) then
                 begin
                   if V_pare_CHeck(Point(i,j)) then
                     begin
                       if S_pare_Check(Point(i,j)) then
                         result := True
                       else
                         begin
                           result := False;
                           exit;
                         end;
                     end
                   else
                     begin
                       result := False;
                       exit;
                     end;
                 end
               else
                 begin
                   result := False;
                   exit;
                 end;
              end;
          end;
    end;
    
    
    
    
    
    
    
    
    
    
     集合配列のすべてを調査
    
    
     集合の要素数を数える
    
     要素数が二つでマス目が決まっていないもの
     
    ← 水平方向の調査
    
    ← 垂直方向の調査
    
    ← 小ブロックエリアの調査
    
     結果 [ ] 空集合になったら False を返す
     中止。
      矛盾あり
       

  3. これでも解決しないのもあって 要素3個のペア(ペアとは言わないか) 
    この考えからいくと 要素が三つなら、配列も三つ必要になる。 人が解くのなら直感的でいいかも知れないが
    ここはコンピューターを使うのを前提にしているので もっと単純で簡単に計算させられる方法を考える。

     パズルとしては面白くない方法 つまり あてはめてみる方法 他のページによると背理法とかと言われている
    方法 コンピューター的には組み合わせシュミレーションってことになった。