最終講 卒業研究と卒業試験

最終話 問題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++;
               }
             }
           }
         }

};
}

すべての問題をクリアされた方、本講座の卒業です!
ご卒業おめでとうございます。

長らくお付き合いありがとうございました。

卒業された方はVC++講義に挑戦しましょう。


第7話へ





025


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ



数学研究室に戻る