第30講 数独(ナンバープレイス)問題解決ソフトVer.1の制作
(数独(ナンバープレイス)問題作成ソフトに挑戦する人は☆☆)
第12話 暫定完成版
コード例
#pragma once
#include<stdlib.h>
#include<math.h>
char a[9][9];
char s;
namespace 数独問題解決ソフトVer1 {
・
・
・
#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);
}
//ここから
dataGridView1[1,1]->Value=L"2";
dataGridView1[2,2]->Value=L"5";
dataGridView1[2,3]->Value=L"8";
dataGridView1[3,3]->Value=L"1";
dataGridView1[7,1]->Value=L"4";
dataGridView1[6,2]->Value=L"8";
dataGridView1[7,3]->Value=L"6";
dataGridView1[9,1]->Value=L"3";
dataGridView1[11,2]->Value=L"7";
dataGridView1[1,7]->Value=L"9";
dataGridView1[3,6]->Value=L"2";
dataGridView1[5,5]->Value=L"9";
dataGridView1[6,5]->Value=L"4";
dataGridView1[5,7]->Value=L"2";
dataGridView1[10,5]->Value=L"2";
dataGridView1[9,6]->Value=L"9";
dataGridView1[10,6]->Value=L"6";
dataGridView1[11,6]->Value=L"5";
dataGridView1[2,11]->Value=L"1";
dataGridView1[5,9]->Value=L"6";
dataGridView1[5,11]->Value=L"4";
dataGridView1[6,11]->Value=L"3";
dataGridView1[9,9]->Value=L"8";
dataGridView1[10,9]->Value=L"3";
dataGridView1[11,9]->Value=L"2";
dataGridView1[10,10]->Value=L"5";
//ここまではいちいちデータを入力しなくてもいいようにしてあります。完成した暁にはすべて削除します。
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^
e) {
array<String^,2>^ w=gcnew array<String^,2>(15,100);
int i,j;
for(i=0;i<15;i++)dataGridView1->Rows->Add();
for(i=0;i<14;i++){
for(j=0;j<14;j++){
w[i,j]=static_cast<String^>(dataGridView1[j,i]->Value);
}
}
char k1=0,k2;
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;
}
}
}
}
s=0;
f(0);
}
void f(char g){
if(s==1)return;
char x,y;
x=g%9;
y=g/9;
char h,i,j,k1,k2;
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==1)return;
}
}
if(a[y][x]==0){
for(i=1;i<10;i++){
h=1;
if(x>0){
for(j=0;j<x;j++){
if(a[y][j]==i){
h=0;
break;
}
}
}
if(h==1){
if(x+1<8){
for(j=x+1;j<9;j++){
if(a[y][j]==i){
h=0;
break;
}
}
}
}
if(h==1){
if(y>0){
for(j=0;j<y;j++){
if(a[j][x]==i){
h=0;
break;
}
}
}
}
if(h==1){
if(y+1<8){
for(j=y+1;j<9;j++){
if(a[j][x]==i){
h=0;
break;
}
}
}
}
if(h==1){
for(j=0;j<3;j++){
if(j!=ya){
for(k=0;k<3;k++){
if(k!=xa){
if(a[3*ys+j][3*xs+k]>0){
if(a[3*ys+j][3*xs+k]==i){
h=0;
break;
}
}
}
}
if(h==0)break;
}
}
}
if(h==1){
a[y][x]=i;
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==1)return;
}
a[y][x]=0;
}
}
}
}
};
}
実行画面
正しい数独(ナンバープレイス)になっていることを確認して下さい。
完成しましたので、
//ここから
dataGridView1[1,1]->Value=L"2";
dataGridView1[2,2]->Value=L"5";
dataGridView1[2,3]->Value=L"8";
dataGridView1[3,3]->Value=L"1";
dataGridView1[7,1]->Value=L"4";
dataGridView1[6,2]->Value=L"8";
dataGridView1[7,3]->Value=L"6";
dataGridView1[9,1]->Value=L"3";
dataGridView1[11,2]->Value=L"7";
dataGridView1[1,7]->Value=L"9";
dataGridView1[3,6]->Value=L"2";
dataGridView1[5,5]->Value=L"9";
dataGridView1[6,5]->Value=L"4";
dataGridView1[5,7]->Value=L"2";
dataGridView1[10,5]->Value=L"2";
dataGridView1[9,6]->Value=L"9";
dataGridView1[10,6]->Value=L"6";
dataGridView1[11,6]->Value=L"5";
dataGridView1[2,11]->Value=L"1";
dataGridView1[5,9]->Value=L"6";
dataGridView1[5,11]->Value=L"4";
dataGridView1[6,11]->Value=L"3";
dataGridView1[9,9]->Value=L"8";
dataGridView1[10,9]->Value=L"3";
dataGridView1[11,9]->Value=L"2";
dataGridView1[10,10]->Value=L"5";
//ここまではいちいちデータを入力しなくてもいいようにしてあります。完成した暁にはすべて削除します。
はすべて削除してください。
そして、いろいろな数独を入力して解かせてみてください。
一応完成ですが、これからいろいろと改良を加えていきます。
Ⅰ 問題を解く時間を計測できるようにする。
Ⅱ 何回でもでもデータを再入力できるように入力ボタンを押すとデータをクリアして再入力できるようにする。
Ⅲ 解答が存在しない問題である場合、答えのない不適切な問題であることを指摘する。
Ⅳ 答えが複数存在した場合にも、答えの複数ある不適切な問題であること指摘する。
Ⅴ 現在入力ミスしたとき、スペースで訂正して実行すると実行エラーを起こすので、スペースで訂正出来るように変更する。
では、皆さんまずⅠ,Ⅱから挑戦しましょう。
ダウンロード用参考ファイルForm1.h
第11話へ 第13話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)