第8講 for文・if文・配列・ポインタを総動員して3次魔方陣の自動生成に挑戦する!
第10話 魔方陣自動生成改良版をさらに2次元配列で改良する

3次魔方陣自動生成改良版を
2次元配列でさらに改良したプログラム例
#include<iostream>
#include <time.h>
using namespace std;
int f(int **x,int cn);
void g(int **x);
void main(){
   int **x=(int **)malloc(sizeof(int)*3);
   for(char i=0;i<3;i++)x[i]=(int *)malloc(sizeof(int)*3);
   int y;
   clock_t hj,ow;
   hj=clock();
   y=f(x,0);
   ow=clock();
   cout<<endl<<"3次魔方陣総数は"<<y<<endl;
   cout<<"魔方陣全解を生成するのにかかった時間は"<<(double)(ow-hj)/1000<<"秒です。"<<endl;
}

int f(int **x,int cn){
 int i,j,k,l,m,n,o,p,q,r,w;
 for(i=1;i<10;i++){
  x[0][0]=i;
  for(j=1;j<10;j++){
   x[0][1]=j;
   if(x[0][1]==x[0][0])goto tobi1;
   for(k=1;k<10;k++){
    x[0][2]=k;
    for(m=0;m<2;m++)if(x[0][2]==x[m/3][m%3])goto tobi2;
    w=0;
    for(m=0;m<3;m++)w=w+x[0][m]; //1行目合計算出
    if(w!=15)goto tobi2;
    for(l=1;l<10;l++){
     x[1][0]=l;
     for(m=0;m<3;m++)if(x[1][0]==x[m/3][m%3])goto tobi3;
     for(n=1;n<10;n++){
      x[1][1]=n;
      for(m=0;m<4;m++)if(x[1][1]==x[m/3][m%3])goto tobi4;
      for(o=1;o<10;o++){
       x[1][2]=o;
       for(m=0;m<5;m++)if(x[1][2]==x[m/3][m%3])goto tobi5;
       w=0;
       for(m=0;m<3;m++)w=w+x[1][m]; //2行目合計算出
       if(w!=15)goto tobi5;
       for(p=1;p<10;p++){
        x[2][0]=p;
        for(m=0;m<6;m++)if(x[2][0]==x[m/3][m%3])goto tobi6;
        w=0;
        for(m=0;m<3;m++)w=w+x[m][2-m]; //右上がり対角線合計算出
        if(w!=15)goto tobi6;
        w=0;
        for(m=0;m<3;m++)w=w+x[m][0]; //1列目合計算出
        if(w!=15)goto tobi6;
        for(q=1;q<10;q++){
         x[2][1]=q;
         for(m=0;m<7;m++)if(x[2][1]==x[m/3][m%3])goto tobi7;
         w=0;
         for(m=0;m<3;m++)w=w+x[m][1]; //2列目合計算出
         if(w!=15)goto tobi7;
         for(r=1;r<10;r++){
          x[2][2]=r;
          for(m=0;m<8;m++)if(x[2][2]==x[m/3][m%3])goto tobi8;
          w=0;
          for(m=0;m<3;m++)w=w+x[2][m]; //3行目合計算出
          if(w!=15)goto tobi8;
          w=0;
          for(m=0;m<3;m++)w=w+x[m][2]; //3列目合計算出
          if(w!=15)goto tobi8;
          w=0;
          for(m=0;m<3;m++)w=w+x[m][m]; //右下がり対角線合計算出
          if(w!=15)goto tobi8;
          g(x);
          cn++;
          tobi8:;
         }
         tobi7:;
        }
        tobi6:;
       }
       tobi5:;
      }
      tobi4:;
     }
     tobi3:;
    }
    tobi2:;
   }
   tobi1:;
  }
 }
 return(cn);
}

void g(int **x){
   for(int i=0;i<3;i++){
     for(int j=0;j<3;j++){
        cout<<x[i][j]<<" ";
     }
     cout<<endl;
   }
   cout<<endl;
}

さて、第8講はこれで終わりにして、
第9講では関数の再帰的使用を学び、
4次魔方陣・5次魔方陣の自動生成に挑戦します。


第9話へ 第9講第1話へ

a

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ