第24講 数独解答作成の作成
第3話 ブロック境界線解答例
#pragma once
#include<stdlib.h>
int n;
int a[10][10];
int x[100],y[100];
int s;
namespace 数独解答作成 {
・
・
・
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
DateTime^ hj=DateTime::Now;
n=9;
s=0;
g(n);
int i;
f(0);
array<String^>^ w=gcnew array<String^>(10);
w[4]=L"数";w[5]=L"独";w[6]=L"総";w[7]=L"数";w[8]=L":";w[9]=s.ToString();
dataGridView1->Rows->Add(w);
DateTime^ ow=DateTime::Now;
TimeSpan sa=ow->Subtract(*hj);
w[4]=L"時";w[5]=L"間";w[6]=L"計";w[7]=L"則";w[8]=L":";w[9]=(sa.TotalSeconds).ToString();
dataGridView1->Rows->Add(w);
}
void g(char n){
char i,j;
for(i=0;i<n*n;i++){
x[i]=i%n;
y[i]=i/n;
}
}
void f(char g){
if(s==100)return;
int i,j,k,h,kk,kkk,xs,ys;
array<String^>^ w=gcnew array<String^>(10);
rand();
rand();
kk=rand()%n;
for(i=0;i<n;i++){
kkk=(kk+i)%n+1;
a[y[g]][x[g]]=kkk;
h=1;
if(x[g]>0){
for(j=0;j<x[g];j++){
if(a[y[g]][x[g]]==a[y[g]][j]){
h=0;
break;
}
}
}
if(h==1){
if(y[g]>0){
for(j=0;j<y[g];j++){
if(a[y[g]][x[g]]==a[j][x[g]]){
h=0;
break;
}
}
}
}
if(h==1){
xs=x[g]/3;
ys=y[g]/3;
for(j=0;j<=y[g]-3*ys;j++){
for(k=0;k<3;k++){
if(j==y[g])if(k==x[g])break;
if((y[g]!=3*ys+j) && (x[g]!=3*xs+k)){
if(a[y[g]][x[g]]==a[3*ys+j][3*xs+k]){
h=0;
break;
}
}
}
if(h==0)break;
}
}
if(h==1){
if(g<n*n-1){
f(g+1);
}
else{
for(j=0;j<n;j++){
for(k=0;k<n;k++){
w[k]=(a[j][k]).ToString();
}
dataGridView1->Rows->Add(w);
}
for(j=0;j<10;j++)w[j]=L"";
dataGridView1->Rows->Add(w);
s++;
if(s==100)return;
}
}
}
}
};
}
ピンクの部分を次のように変更します。
char l;
if(h==1){
if(g<n*n-1){
f(g+1);
}
else{
for(j=0;j<n;j++){
if(j%3==0){
for(k=0;k<13;k++)w[k]=L"*";
dataGridView1->Rows->Add(w);
}
l=0;
for(k=0;k<n;k++){
if(k%3==0){
w[k+l]=L"*";
l++;
}
w[k+l]=(a[j][k]).ToString();
}
w[k+l]=L"*";
dataGridView1->Rows->Add(w);
}
for(k=0;k<13;k++)w[k]=L"*";
dataGridView1->Rows->Add(w);
for(j=0;j<13;j++)w[j]=L"";
dataGridView1->Rows->Add(w);
s++;
if(s==100)return;
}
紺の部分が変更ないしは加えた部分です。
もちろんデザインも
と変更しておかなければなりません。
実行画面
解説
if(j%3==0){
for(k=0;k<13;k++)w[k]=L"*";
dataGridView1->Rows->Add(w);
}
では、1行目、4行目、7行目に
アスタリスク(*)を入れています。
そして、
for(k=0;k<13;k++)w[k]=L"*";
dataGridView1->Rows->Add(w);
で10行目にアスタリスク(*)を入れています。
if(k%3==0){
w[k+l]=L"*";
l++;
}
においては、各行の1列目、4列目、7列目にアスタリスク(*)を入れています。
そして、
w[k+l]=L"*";
で10列目にアスタリスク(*)を入れています。
w[k+l]=(a[j][k]).ToString();
のk+lは、1列目、4列目、7列目にアスタリスク(*)が入ったので、その分をずらしています。
ブロックの重複チェックの解説は次話で行います。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座