第30講 数独(ナンバープレイス)問題解決ソフトVer.1の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)
第4話 問題データ以外の欄にランダムな数字を入れる
第3話問題解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,j;
array<String^>^ x=gcnew array<String^>(15);
for(i=1;i<14;i++){
if(i%4==1)for(j=0;j<13;j++)x[j]=L"*";
if(i%4!=1)for(j=1;j<13;j++){
if(j%4==1)x[j]=L"*";
if(j%4!=1)x[j-1]=L"";
}
dataGridView1->Rows->Add(x);
}
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^
e) {
int i,j;
for(i=0;i<15;i++)dataGridView1->Rows->Add();
array<String^,2>^ w=gcnew array<String^,2>(15,100);
for(i=0;i<14;i++){
for(j=0;j<14;j++){
w[i,j]=static_cast<String^>(dataGridView1[j,i]->Value);
}
}
for(i=0;i<14;i++){
for(j=0;j<14;j++){
dataGridView1[j,15+i]->Value=w[i,j];
}
}
char k1=0,k2,a[9][9];
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(w[i,j]!=L"")a[i-k1][j-k2]=int::Parse(w[i,j]);
if(w[i,j]==L"")a[i-k1][j-k2]=0;
}
}
}
}
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)dataGridView1[j,15+i]->Value=rand()%9+1;
}
}
}
}
}
}
};
}
実行例
数独(ナンバープレイス)のルールを無視してランダムに入れてますので、数独(ナンバープレイス)にはなっていませんが、
問題部分は正確に写し取られています。
これに
ⅰ 行に同じ数字が入ってはいけない
ⅱ 列に同じ数字が入ってはいけない
ⅲ ブロック内に同じ数字が入ってはいけない
の3つルールを付け加えれば数独(ナンバープレイス)はできあがります。
今回も難解になってしまいましたので、次話で詳しく説明します。
ダウンロード用参考ファイルForm1.h
第3話へ 第5話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)