第19講 座標の工夫による魔方陣自動生成ソフトの高速化

第8話 各セルに入れる数字の始まりを変える
コード主要部分再掲

long f(int **x,int n,long cn,int g){
   int i,j,s,t,w,v;
   s=g/n;
   t=g%n;
   for(i=1;i<n*n+1;i++){
     x[s][t]=i;
     v=0;
     if(k[i-1]==0){
        k[i-1]=1;
        v=1;
     }
     else{
        goto tobi;
     }
     if(s==n-1 && t==n-1){
        w=0;
        for(j=0;j<n;j++)w=w+x[j][j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==n-1 && t==0){
        w=0;
        for(j=0;j<n;j++)w=w+x[j][n-1-j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==0 && t==n-2){
        w=0;
        for(j=0;j<n;j++)w+=x[s][j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     for(j=0;j<n;j++)w+=x[j][t];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s>0 && s<n-1 && t==n-1){
        w=0;
        for(j=0;j<n;j++)w+=x[s][j];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(s==n-1 && t>0 && t<n-1){
        w=0;
        for(j=0;j<n;j++)w+=x[j][t];
        if(w!=n*(n*n+1)/2)goto tobi;
     }
     if(g+1<n*n){
        cn=f(x,n,cn,g+1);
        if(cn==100)return(cn);
     }
     else{
        h(x,n);
        cn++;
        if(cn==100)return(cn);
     }
     tobi:;
     if(cn==100)return(cn);
     if(v==1)k[i-1]=0;
   }
   return(cn);
}


このプログラムでは、各セルに
4次魔方陣の場合
1,2,3,4,・・・・,15,16
5次魔方陣場合
1,2,3,4,・・・・,24,25
と順番に入れています。
ですから、セルは


4
4



4
4



4
4



4
4



4
4



4
4

のように動いていきます。
4次魔方陣の場合は、すでに破綻しています。







最後のセルに最大の25入れても、
合計を34にすることは出来ません。
それで1つ前の段階の修正を余儀なくされ、

24







までいって、次ぎに

24
25







最初の対角線が完成します。


もし順番に入れていくのではなく、
各セル毎に
14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13
4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3
9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8
などと、始まりの数字を変えることができれば、


4
4

のような数字の重複を防ぐことが出来て、

14


4
24
11
18
4

早い段階の破綻を防ぐことが出来ます。
それぞれの場合、

14


4
24
11
18
4

1つ前に戻って修正をし続ける必要がなく、
圧倒的に効率が良くなります。

では、各セル毎の始まりの数字を変えるにはどうしたらよいでしょうか。




第7話へ 第9話へ

a

eclipse c++ 入門講義第1部へ

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