7.4の累乗の奇数倍方陣を作成するプログラム例
 
 ここではインデントはとっていない。元々のテキストは当然インデントはとってあるが、Turbo C++で作ったインデント( TABの部分)はなぜかインターネットエクスプローラーには反映されない。インデントをワープロを利用してスペースでとると、Turob C++で読み込んで、コンパイルするとエラーしてしまうので、あえてインデントはとっていない。下のテキスト形式をそのままC言語に読み込んでやれば、コンパイルできるはずである。是非コンパイルしていただきたい。 
 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 100
#define BAI 4
#define MAX1 16
#define MAH 9
#define KRK 100
#define KR 30
char tanemoto(char d,char g,char n);
void taneseisei(char g);
void gousei(char s,char t);
void seisou(char n);
int kai=0;
unsigned int kn;
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("リターンすると、16方陣について計算します。");
getchar();
x=malloc(2*MAH*MAH);
houjinn=malloc(2*MAX1*MAX1);
 
seisou(n);
tanemoto(0,0,n);
gotoxy(5,23);
printf("  何かキーを入力してください。");
getchar();
}
 
 
void gousei(char s,char t)
{
static int y[MAX1][MAX1];
char i,j;
char k,l;
char ken=1;
int w;
 
clrscr();
gotoxy(4*(MAX1-1),2);
printf("縦横合計");
gotoxy(4*(MAX1-1)+2,MAX1+4);
printf("斜め合計");
gotoxy(4*MAX1+7,2);
printf("横");
gotoxy(4*MAX1+12,2);
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){
kai++;
gotoxy(45,23);
printf("魔方陣の個数=%d",kai);
for(i=0;i<MAX1;i++)
for(j=0;j<MAX1;j++){
gotoxy(4*j+1,i+3);
printf("%3d",y[i][j]);
}
}
w=0;
for(i=0;i<MAX1;i++){
for(j=0;j<MAX1;j++)
w=w+y[i][j];
gotoxy(4*MAX1+6,i+3);
printf("%4d",w);
w=0;
}
w=0;
for(i=0;i<MAX1;i++){
for(j=0;j<MAX1;j++)
w=w+y[j][i];
gotoxy(4*MAX1+11,i+3);
printf("%4d",w);
w=0;
}
w=0;
for(i=0;i<MAX1;i++)
w=w+y[i][i];
gotoxy(4*MAX1+11,MAX1+4);
printf("%4d",w);
w=0;
for(i=0;i<MAX1;i++)
w=w+y[i][MAX1-1-i];
gotoxy(4*MAX1+11,MAX1+5);
printf("%4d",w);
gotoxy(1,1);
printf("リターンすると次を表示します。        ");
getchar();
}
 
char tanemoto(char d,char g,char n)
{
char i,j,k,l,h,kaesu=0,w1,w2,ii;
 
if(n%2==0){
if(g<n){
i=g;
j=g;
}
else if(g<2*n){
i=g-n;
j=2*n-g-1;
}
else{
i=(g-2*n)/(n-2);
j=(g-2*n)%(n-2);
if(i<n-i-1){
if(j>=i)
j++;
if(j>=n-i-1)
j++;
}
if(n-i-1<i){
if(j>=n-i-1)
j++;
if(j>=i)
j++;
}
}
}
else{
if(g<n){
i=g;
j=g;
}
else if(g<2*n-1){
i=g-n;
j=n-i-1;
if(i>=j){
i++;
j--;
}
}
else if(g<(n+1)*n/2){
i=(g-2*n+1)/(n-2);
j=(g-2*n+1)%(n-2);
if(j>=i)
j++;
if(j>=n-i-1)
j++;
}
else if(g<(((n+1)/2+1)*n-1)){
i=(n+1)/2-1;
j=g-(n+1)*n/2;
if(i<=j)
j++;
}
else{
i=(g-2*n)/(n-2);
j=(g-2*n)%(n-2);
if(j>=n-i-1)
j++;
if(j>=i)
j++;
}
}
 
k=1;
if(d==1)
w1=*(x+i*MAH+j)-1;
while(k<n+1){
h=1;
w2=k-1;
*(x+i*MAH+j+d*MAH*MAH)=k;
/*
gotoxy(2*j+1,3+i+n);
printf("%d",*(x+i*MAH+j+d*MAH*MAH));
*/
if(i==j)
for(l=0;l<i;l++){
if(*(x+i*MAH+i+d*MAH*MAH)==*(x+l*MAH+l+d*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+d*MAH*MAH)==*(x+l*MAH+n-1-l+d*MAH*MAH)){
h=0;
break;
}
}
if(h==1)
if(i>j && *(x+i*MAH+j+d*MAH*MAH)==*(x+i*MAH+i+d*MAH*MAH))h=0;
if(h==1)
if(i<j && *(x+i*MAH+j+d*MAH*MAH)==*(x+j*MAH+j+d*MAH*MAH))h=0;
if(h==1)
if(j<n-i-1 && *(x+i*MAH+j+d*MAH*MAH)==*(x+i*MAH+n-i-1+d*MAH*MAH))h=0;
if(h==1)
if(j<n-i-1 && *(x+i*MAH+j+d*MAH*MAH)==*(x+(n-j-1)*MAH+j+d*MAH*MAH))h=0;
if(h==1)
for(l=0;l<i;l++){
if(*(x+i*MAH+j+d*MAH*MAH)==*(x+l*MAH+j+d*MAH*MAH)){
h=0;
break;
}
}
if(h==1)
for(l=0;l<j;l++){
if(*(x+i*MAH+j+d*MAH*MAH)==*(x+i*MAH+l+d*MAH*MAH)){
h=0;
break;
}
}
if(d==1 && h==1){
if(hairetu[w1][w2]==0){
hairetu[w1][w2]=1;
}
else
h=0;
}
if(h==1)
if(d==0)
if(g+1<n*n){
kaesu=tanemoto(d,g+1,n);
}
else{
seisou(n);
/*
seisoux(1,n);
*/
kn++;
gotoxy(65,22);
printf("syusuu=%ld",kn);
tanemoto(1,0,n);
}
else
if(g+1<n*n){
kaesu=tanemoto(d,g+1,n);
}
else{
for(l=0;l<n;l++)
taneseisei(l);
seisou(n);
}
if(h==1)
if(d==1 && kaesu==1){
h=0;
hairetu[w1][w2]=0;
}
else{
 k++;
}
if(h==0)
k++;
}
if(h==1)
kaesu=0;
else
kaesu=1;
*(x+i*MAH+j+d*MAH*MAH)=0;
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 taneseisei(char g)
{
char i,j,k,l;
 
for(i=0;i<BAI;i++)
for(j=0;j<BAI;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)+(*(x+g*MAH*MAH+i*MAH+j)-1)*BAI;
}
if(g==1){
gousei(0,1);
}
}
 
                  


 

戻る
 


 
                             
                     
                    


 

進む
 


 
                             
                     
                    


 

目次へ
 


 

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

パワーポイント講義へ

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


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


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