最終講 卒業研究と卒業試験
最終話 問題18(最終問題)解答例
#pragma once
int a[3][3],x[9],y[9],s;
namespace 3次魔方陣 {
using namespace System;
using namespace System::ComponentModel;
・
・
・
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
s=0;
h(); //座標の作成
f(0); //魔方陣の作成
dataGridView1->Rows->Add();
dataGridView1[3,4*s]->Value=s.ToString(); //魔方陣総数の表示
}
void h(){
int i;
for(i=0;i<9;i++){
x[i]=i%3;
y[i]=i/3;
}
}
void f(int g){
int i,j,k,h,w;
for(i=0;i<9;i++){
a[y[g]][x[g]]=i+1;
h=1;
//数字の重複チェック
if(g>0){
for(j=0;j<g;j++){
if(a[y[g]][x[g]]==a[y[j]][x[j]]){
h=0;
break;
}
}
}
//行の合計チェック
if(h==1){
if(x[g]==2){
w=0;
for(j=0;j<3;j++){
w+=a[y[g]][j];
}
if(w!=15) h=0;
}
}
//列の合計チェック
if(h==1){
if(y[g]==2){
w=0;
for(j=0;j<3;j++){
w+=a[j][x[g]];
}
if(w!=15) h=0;
}
}
//逆対角線の合計チェック
if(h==1){
if(y[g]==2 && x[g]==0){
w=0;
for(j=0;j<3;j++){
w+=a[j][2-j];
}
if(w!=15) h=0;
}
}
//対角線の合計チェック
if(h==1){
if(y[g]==2 && x[g]==2){
w=0;
for(j=0;j<3;j++){
w+=a[j][j];
}
if(w!=15) h=0;
}
}
if(h==1){
if(g+1<9){
f(g+1);
}
else{
for(j=0;j<3;j++){
dataGridView1->Rows->Add();
for(k=0;k<3;k++){
dataGridView1[k,4*s+j]->Value=(a[j][k]).ToString();
}
}
dataGridView1->Rows->Add();
s++;
}
}
}
}
};
}
すべての問題をクリアされた方、本講座の卒業です!
ご卒業おめでとうございます。
長らくお付き合いありがとうございました。