第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;
}
}
}
}
について詳しく解説しましょう。
まず、xとyの意味を把握しないと、このコードは理解できません。
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
ですから、xとyはブロック列数とブロック列数に相当しますね。
(一度述べていますが重要なことなので、念のためもう一度注意事項を述べておきます。
以下の説明で
が主体となっているセルであることに留意して下さい。
今回のコードを理解するためには、主体となるセル(対象セル)と客体セル(対象以外のセル)
を区別することが大事です。)
では、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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
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)のリスト | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
○ | × | × | ○ | ○ | × | ○ | × | × |
rlst[3][4][0]=1、rlst[3][4][1]=4、rlst[3][4][2]=5、rlst[3][4][3]=7
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)