第32講 数独(ナンバープレイス)問題解決ソフトVer.3の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)
第3話 入力順の決定を1つのセルにする方法
void nyuryokujyunkoutiku(char g){
char i,j,k,h,jh,ih;
char min=100;
k=0;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(a[i][j]==0){
h=1;
if(g>0){
for(k=0;k<g;k++){
if(j==zx[k] && i==zy[k]){
h=0;
break;
}
}
}
if(h==1){
if(b[i][j]<min){
min=b[i][j];
ih=i;
jh=j;
}
}
}
}
}
zx[g]=jh;
zy[g]=ih;
}
}
・
・
・
void f(char g){
if(s==2)return;
・
・
・
if(h==1){
a[y][x]=rlst[y][x][iii];
if(g+1<81){
nyuryokujyunkoutiku(g+1);
f(g+1);
}
・
・
・
これが正解です。しかし、これだと
は18秒で解けていたのに1分ぐらいかかるようになってしまいました。
しかし、ちょっとした完全を付け加えるだけで、0.95秒で解けるようになります。
ヒントは、全体構造解析を最初のみ行っていましたが、
セルに数字を入れる度に構造が変わります。
ですから最初のみの構造解析ではなく、毎回行えばよいのです。
ただし、
void f(char g){
if(s==2)return;
char x,y,xa,xs,ya,ys;
x=zx[g];
y=zy[g];
xa=x%3;
xs=x/3;
ya=y%3;
ys=y/3;
char h,i,j,k,k1,k2,ii,iii;
if(a[y][x]>0){
if(g+1<81){
f(g+1);
}
else{
k1=0;
for(i=0;i<13;i++){
if(i%4==0){
k1++;
for(j=0;j<13;j++)dataGridView1[j,i+14]->Value=L"*";
}
if(i%4>0){
k2=0;
for(j=0;j<13;j++){
if(j%4==0){
dataGridView1[j,i+14]->Value=L"*";
k2++;
}
if(j%4>0){
dataGridView1[j,i+14]->Value=a[i-k1][j-k2];
}
}
}
}
s++;
if(s==2)return;
}
}
if(a[y][x]==0){
ii=rand()%b[y][x];
for(i=0;i<b[y][x];i++){
・
・
・
のii=rand()%b[y][x];は改善が必要です。セルに数字が埋まっていく間にb[y][x]=0となることがあり得るからです。
さて、皆さん改良を試みましょう。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)