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;
}
}