第30講 数独(ナンバープレイス)問題解決ソフトVer.1の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)
第10話 列の条件(縦の条件)を加える。
行の条件に成功したのですから、列の条件は簡単そうに見えます。
例えば、次のようにコーティングすればうまくいくような気がします。
k1=0;
for(i=0;i<13;i++){
if(i%4==0)k1++;
if(i%4!=0){
k2=0;
for(j=0;j<13;j++){
if(j%4==0)k2++;
if(j%4!=0){
if(a[i-k1][j-k2]==0){
for(k=1;k<10;k++){
h=1;
if(j-k2>0){
for(l=0;l<j-k2;l++){
if(a[i-k1][l]==k){
h=0;
break;
}
}
}
if(h==1){
if(j-k2+1<8){
for(l=j-k2+1;l<9;l++){
if(a[i-k1][l]==k){
h=0;
break;
}
}
}
}
if(h==1){
if(i-k1>0){
for(l=0;l<i-k1;l++){
if(a[l][j-k2]==k){
h=0;
break;
}
}
}
}
if(h==1){
if(i-k1+1<8){
for(l=i-k1+1;l<9;l++){
if(a[l][j-k2]==k){
h=0;
break;
}
}
}
}
if(h==1){
a[i-k1][j-k2]=k;
dataGridView1[j,15+i]->Value=a[i-k1][j-k2];
}
}
}
}
}
}
if(h==1){
if(i-k1>0){
for(l=0;l<i-k1;l++){
if(a[l][j-k2]==k){
h=0;
break;
}
}
}
}
if(h==1){
if(i-k1+1<8){
for(l=i-k1+1;l<9;l++){
if(a[l][j-k2]==k){
h=0;
break;
}
}
}
}
が列の条件です。
ところが実行してみると、
と空欄が出来てしまいました。これは当然です。は行を見ると1しか入りません。
ところが、列の条件から1はだめなのです。
実は、私もfor文版でもいけるかなと思っていたのですが、
やはりだめなのです。
再帰版の場合行き詰まったら戻ってやり直すことが出来ますが、
for文版の場合行き詰まったらおしまいです。
すべての場合を尽くしていないのです。
そこで、皆さん今回のコードを
第24講 数独解答の作成☆
第1話 数独とは?
第2話 数独解答ソフト解答例
第3話 ブロック境界線解答例
第4話 ブロック重複判定部分解説
を参考に作り直しましょう。
第9話へ 第11話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)