第31講 数独(ナンバープレイス)問題解決ソフトVer.2の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)


第7話 
問題全体構造解析のコード解説その2
for(k=0;k<3;k++){
  for(l=0;l<3;l++){
    if(3*y+k!=i && 3*x+l!=j)
      if(a[3*y+k][3*x+l]>0){
        lst[i][j][a[3*y+k][3*x+l]-1]=0;
      }
    }
  }
}

について詳しく解説しましょう。
まず、
xyの意味を把握しないと、このコードは理解できません。

  1 2 3
0 1 4
3 9 6
1 5
6 3
1 4 8
2 2 3 6
5
4 8

xは上表のブロック列数(ブロック単位で数えた列数)です。
また、yは上表のブロック行数(ブロック単位で数えた)です。
このサイトの特徴である色対応に注意してください。
0÷3=0・・・0、1÷3=0・・・1、2÷3=0・・・2、3÷3=1・・・0、4÷3=1・・・1、
5÷3=1・・・2、6÷3=2・・・0、7÷3=2・・・1、8÷3=2・・・2
ですから、xyはブロック列数とブロック列数に相当しますね。


(一度述べていますが重要なことなので、念のためもう一度注意事項を述べておきます。
以下の説明で

が主体となっているセルであることに留意して下さい。
今回のコードを理解するためには、主体となるセル(対象セル)と客体セル(対象以外のセル)
を区別することが大事です。)


では、if(3*y+k!=i && 3*x+l!=j)は何を意味しますか。
これは実はなくても、構造解析に影響はありません。
ただ、これがないと

9 6

9と6は2回チェックされてしまいます。
行でチェックされ、ブロックでチェックされるからです。同じく、

ックとの重複です。
数独の問題を作ることが、最終目標です。
これは時間との戦いです。
ほんの少しでも無駄を排除しなければなりません。
if(3*y+k!=i && 3*x+l!=j)は

2
8


3
8

茶色のセルを排除するためにあります。これらは列チェック・行チェックにおいて一度調べられているからです。

      if(a[3*y+k][3*x+l]>0){
        lst[i][j][a[3*y+k][3*x+l]-1]=0;
      }

は、

5
1 4

なら、

   0  1 3  4  5
0 1 4
1 3 9 6
2
3 5
4 6 3
5 1 4 8
6 2 3 6
7 5
8 4 8

a[3][6]である5、a[5][4]である1、a[5][5]である4をリストから除外します。

                for(k=0;k<9;k++){
                  if(lst[i][j][k]==1){
                    rlst[i][j][b[i][j]]=k+1; //lstがオン(○)とき、実際にリストする。
                    b[i][j]++; //リスト個数を数える配列。
                  }
                }
ここでは、lstのオンオフに基づいて、リストしリスト個数を数えます。
例えば、

座標(3,4)のリスト 
× × × × ×

rlst[3][4][0]=1、rlst[3][4][1]=4、rlst[3][4][2]=5、rlst[3][4][3]=7




第6話へ 第8話へ


戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)