6.4の奇数倍方陣を作成するプログラム例
 
 Turobo C++でテキストは作ってある。残念ながらTurobo C++のインデント(TAB)の部分は、インターネットエクスプローラーには反映されない。インデントがないとプログラムを理解するのは困難なので、ワープロを利用してスペースでインデントをとってある。しかし、不幸なことにワープロのスペースで作ったインデントは、C言語で読み込んでコンパイルする際に、エラーの原因になってしまう。C言語に読み込んだ際には、インデントは一度消して、コンパイルしていただきたい。また、インデントをTABで取り直しておくとプログラムを読む際に都合がいいと思う。
 
 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 100
#define BAI 4
#define MAX1 20
#define MAH 9
#define KRK 100
#define KR 30
void tane(char n,char *x);
char tane1(char g,char n,char *x);
void tane2(char g,char n,char *x);
void gousei(char s,char t,char n,char *houjinn);
void seisou(char n);
int kai=0;
char hairetu[MAH][MAH];
char *houjinn;
char *x;
void main()
{
    char n,g;
    int i,j,ii;
    unsigned int kn=0;
 
    clrscr();
    n=4;
    printf("リターンすると、20方陣について計算します。");
    getchar();
    x=malloc(2*MAH*MAH);
    houjinn=malloc(2*MAX1*MAX1);
 
    i=1;
    while(i){
        tane(n,x);
        kn++;
        gotoxy(40,15);
        printf("試行回数=%d",kn);
        i=tane1(0,n,x);
        seisou(n);
    }
    for(g=0;g<2;g++)
        tane2(g,n,x);
    gousei(0,1,n,houjinn);
/*
    gotoxy(5,23);
    printf("  何かキーを入力してください。");
*/
    getchar();
}
 
void tane(char n,char *x)
{
    register int i,j;
    char k,l,h=0,tz,tzz,kr,gg,st,w;
    tz=1;
    while(tz){
        tzz=1;
        while(tzz){
            i=0;
            while(i<n){
                *(x+i*MAH+i)=random(n)+1;
                gotoxy(2*i+1,i+2);
                printf("%d",*(x+i*MAH+i));
                if(i>0){
                    for(j=0;j<i;j++){
                        if(*(x+i*MAH+i)==*(x+j*MAH+j)){
                            h=1;
                            break;
                        }
                    }
                    if(h==1){
                        i--;
                        h=0;
                    }
                }
                i++;
            }
            i=0;
            kr=0;
            while(i<n){
                 if(i!=n-1-i){
                    *(x+i*MAH+n-1-i)=random(n)+1;
                    kr++;
                    if(kr>KR)break;
                    gotoxy(2*(n-1-i)+1,i+2);
                    printf("%d",*(x+i*MAH+n-1-i));
                  if(*(x+i*MAH+i)==*(x+i*MAH+n-1-i) || *(x+i*MAH+n-1-i)==*(x+(n-1-i)*MAH+n-1-i)){
                        h=1;
                        i--;
                    }
                    if(h==0){
                         if(i>0){
                            for(j=0;j<i;j++){
                              if(*(x+i*MAH+n-1-i)==*(x+j*MAH+n-1-j)){
                                    h=1;
                                    break;
                               }
                            }
                            if(h==1){
                                i--;
                                h=0;
                            }
                        }
                    }
                }
                if(h==1)h=0;
                i++;
            }
            if(kr<=KR)tzz=0;
        }
        i=0;
        while(i<n){
            j=0;   h=0;   kr=0;
            while(j<n){
                if(i!=j && (n-1-i)!=j){
                     *(x+i*MAH+j)=random(n)+1;
                        kr++;
                     if(kr>KRK)break;
                  if(*(x+i*MAH+j)==*(x+i*MAH+i) || *(x+i*MAH+j)==*(x+i*MAH+n-1-i)
 || *(x+i*MAH+j)==*(x+j*MAH+j) || *(x+i*MAH+j)==*(x+(n-1-j)*MAH+j)){
                       h=1;
                    }
                }
                gotoxy(2*j+1,i+2);
                printf("%d",*(x+i*MAH+j));
                if(h==0){
                     if(i>0){
                         for(k=0;k<i;k++){
                         if(*(x+k*MAH+j)==*(x+i*MAH+j)){
                                h=1;
                                break;
                            }
                        }
                     }
                }
                if(h==1){
                    j--;
                    h=0;
                }
                else if(j>0)
                    for(k=0;k<j;k++)
                        if(*(x+i*MAH+k)==*(x+i*MAH+j)){
                            j--;
                            break;
                    }
                j++;
            }
            if(kr>KRK)
                break;
            i++;
        }
        if(kr<=KRK)tz=0;
   }
}
 
void gousei(char s,char t,char n,char *houjinn)
{
    static int y[MAX1][MAX1];
    char i,j;
    char k,l;
    char ken=1;
    int w;
 
    clrscr();
    printf("リターンすると、20方陣について計算します。\n");
    gotoxy(1,MAX1+1);
    printf("縦横斜め合計");
    for(i=0;i<MAX1;i++){
        for(j=0;j<MAX1;j++){
         y[i][j]=*(houjinn+i*MAX1+j+s*MAX1*MAX1)+MAX1*(*(houjinn+i*MAX1+j+t*MAX1*MAX1)-1);
        }
    }
    for(i=0;i<MAX1;i++)
        for(j=0;j<MAX1;j++)
            for(k=0;k<=i;k++)
                for(l=0;l<MAX1;l++){
                    if((k==i) && (l==j))break;
                        if(y[i][j]==y[k][l]){
                        ken=0;
                        goto end;
                    }
                }
    end:
    if(ken==1){
        for(i=0;i<MAX1;i++)
            for(j=0;j<MAX1;j++){
                gotoxy(4*j+1,i+1);
                printf("%3d",y[i][j]);
            }
    }
    printf("\n");
    printf("\n");
    w=0;
    for(i=0;i<MAX1;i++){
        for(j=0;j<MAX1;j++)
              w=w+y[i][j];
        printf("%5d",w);
        w=0;
    }
    w=0;
    for(i=0;i<MAX1;i++){
        for(j=0;j<MAX1;j++)
              w=w+y[j][i];
        printf("%5d",w);
        w=0;
    }
    w=0;
    for(i=0;i<MAX1;i++)
        w=w+y[i][i];
    printf("%5d",w);
    w=0;
    for(i=0;i<MAX1;i++)
        w=w+y[i][MAX1-1-i];
    printf("%5d",w);
}
 
char tane1(char g,char n,char *x)
{
    char i,j,k,l,h,kaesu=0,w1,w2;
 
    i=g/n;
    j=g%n;
    k=1;
    w1=*(x+i*MAH+j)-1;
    while(k<n+1){
        h=1;
        w2=k-1;
        *(x+i*MAH+j+MAH*MAH)=k;
        gotoxy(2*j+1,2+i+n+1);
        printf("%d",*(x+i*MAH+j+MAH*MAH));
        for(l=0;l<i;l++){
            if(*(x+i*MAH+j+MAH*MAH)==*(x+l*MAH+j+MAH*MAH)){
                h=0;
                break;
             }
        }
        if(h==1)
            for(l=0;l<j;l++){
              if(*(x+i*MAH+j+MAH*MAH)==*(x+i*MAH+l+MAH*MAH)){
                    h=0;
                    break;
                }
             }
       if(h==1 && i==j)
           for(l=0;l<i;l++){
              if(*(x+i*MAH+i+MAH*MAH)==*(x+l*MAH+l+MAH*MAH)){
                  h=0;
                  break;
              }
           }
       if(h==1 && i==n-j-1)
           for(l=0;l<i;l++){
              if(*(x+i*MAH+n-i-1+MAH*MAH)==*(x+l*MAH+n-1-l+MAH*MAH)){
                  h=0;
                  break;
              }
           }
        if(h==1){
            if(hairetu[w1][w2]==0){
                hairetu[w1][w2]=1;
            }
            else
                h=0;
        }
        if(h==1)
            if(g+1<n*n){
                kaesu=tane1(g+1,n,x);
            }
            else{
                break;
            }
        if(h==1)
            if(kaesu==1){
                 h=0;
                 hairetu[w1][w2]=0;
                 if(i==0)break;
             }
            else{
                 break;
            }
         if(h==0)
             k++;
    }
    if(h==1)
         kaesu=0;
    else
         kaesu=1;
    return(kaesu);
}
 
void seisou(char n)
{
    char i,j;
 
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            hairetu[i][j]=0;
}
 
void tane2(char g,char n,char *x)
{
    char i,j,k,l,jyunnbann[2][5][5]={1,2,3,4,5,
                  3,4,5,1,2,
                  5,1,2,3,4,
                  2,3,4,5,1,
                  4,5,1,2,3,
                  1,2,3,4,5,
                  4,5,1,2,3,
                  2,3,4,5,1,
                  5,1,2,3,4,
                  3,4,5,1,2};
        clrscr();
        for(i=0;i<BAI+1;i++)
             for(j=0;j<BAI+1;j++)
                 for(k=BAI*i;k<BAI*(i+1);k++)
                     for(l=BAI*j;l<BAI*(j+1);l++){
                       *(houjinn+g*MAX1*MAX1+k*MAX1+l)=*(x+g*MAH*MAH+(k-BAI*i)*MAH+l-BAI*j)+(jyunnbann[g][i][j]-1)*BAI;
                     }
}
 
 
 


 

戻る
 


 
                             
                     
                    


 

進む
 


 
                             
                     
                    


 

目次へ
 


 

魔方陣新HPへ
魔方陣トップへ数学研究室へ

パワーポイント講義へ

小中学生のための魔方陣授業


上にメニューが示されてない場合は、下のロゴ右脳数学(直観数学)またはURLをクッリク!


http://www5b.biglobe.ne.jp/~suugaku/