输出魔方阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(j=k+m;j>m+1;j--){//从中间列开始向左数k-1列
t=a[i][j];
a[i][j]=a[i+m][j];//...与B应位置交换
a[i+m][j]=t;
}
}
void OutMagic(int a[M][M],int n)//输出n阶魔方阵!
{
int i,j;
for(i=0;i<n;i++){
printf("\n");
for(j=0;j<n;j++)printf("%4d",a[i][j]);
}
}
void SumMagic(int a[M][M],int n)//求魔方阵各行/列的和
{
int i,j;
for(i=0;i<n;i++)//各行的和
for(j=0;j<n;j++)a[i][n]+=a[i][j];
for(i=0;i<n;i++)//各列的和
for(j=0;j<n;j++)a[n][i]+=a[j][i];
for(i=0;i<n;i++)a[n][n]+=a[i][i];//主对角线的和
}
void main()
{
int n;
int a[M][M]={0};
printf("魔方阵的阶数n=");//n为大于2的任意整数
//n为任意阶数的魔方阵算法综合如下:
#include<stdio.h>
#define M 30
void MagicOdd(int a[M][M],int row,int col,int st,int n)
{//row,col起始行列数,st起始数,n阶数
int i,j,count=st,ai,aj;
static int a[21][21];
printf("n=");
scanf("%d",&n);
a[0][n/2]=count++;
for(i=0,j=n/2;count<=n*n;count++){
j=(j+1)%n;//列右移
i=(i-1+n)%n;//行下移
if(a[i][j]){//若已存放
4.输出"魔方阵".
所谓魔方阵,是指这样的方阵,它的每一行、每一列和对角线之和均相等。
要求:从键盘输入一个n(n>2),输出由1~n2的自然数构成的魔方阵;
如n=3时的魔方阵为:
816
357
492
//一、当n为奇数时魔方阵的算法
#include<stdio.h>
void main()
{
int i,j,count=1,n;
}
}
//三、当n为单偶数(n=4k+2)时,可把方阵分为4个2k+1的小方阵,编号如下:
//1.各小方阵按奇数阶算法依次填入A(1…[2k+1]2)、B([2k+1]2+1…2[2k+1]2)、C(…)、D(…4[2k+1]2);
//2.将A与D换:A中间格始向右取k格;A最左边的k列(除中行);
//3.将C与B互换:从C的中间列开始向左数k-1列。
}
SumMagic(a,n);//计算各行/列的和
OutMagic(a,n);//输出魔方阵
printf("\n\n校验:\n");
OutMagic(a,n+1);//输出魔方阵及各行/列的和进行验证
}
}
void MagicSev(int a[M][M],int st,int n)//单偶4k+2阶魔方阵,起始数st
{
int m=n/2,k=m/2;//将原矩阵分为2×2的方阵
int i,j,t;
MagicOdd(a,0,0,1,m);//A阵(左上)
MagicOdd(a,m,m,m*m+1,m);//B阵(右下)
for(j=0;j<n;j++)//从左至右...
for(i=0;i<n;i++)a[j][i]=st++;//...从上至下填充方阵,值递增
for(j=0;j<n;j++)
for(i=0;i<n;i++)
if(j%4==i%4||(j%4+i%4)==3)//每4×4对角线上元素
a[i][j]=g-a[i][j];//...换成其补数
#include<stdio.h>
void main()
{
int i,j,n,g,st=1;
int a[21][21];
printf("n=");
scanf("%d",&n);
g=n*n+1;//定义a+b=g为互补数
for(j=0;j<n;j++)//从左至右...
for(i=0;i<n;i++)a[j][i]=st++;//...从上至下填充方阵,值递增
}
for(i=0;i<m;i++){//A的各行...
if(i!=k)//...除中间行外
for(j=0;j<k;j++){//...取最左边的k列
t=a[i][j];
a[i][j]=a[i+m][j];//...与D应位置交换
a[i+m][j]=t;
}
}
for(i=0;i<m;i++)//C的各行
i=row,j=col+n/2;//第一行的正中间位置
a[i][j]=count++;//第一个元素放在第一行的正中间
for(;count<st+n*n;count++){
ai=i,aj=j;//保存前一元素角标
i--,j++;//下一元素放在右上方
if(i<row)i=row+n-1;//若超过第0行则放在最后一行
scanf("%d",&n);
switch(n%4){
case 1:
case 3:MagicOdd(a,0,0,1,n);break;//奇数阶魔方阵
case 0:MagicDev(a,1,n);break;//双偶(4k)阶魔方阵
case 2:MagicSev(a,1,n);break;//单偶(4k+2)阶魔方阵
j=(n+j-1)%n;//列归位(j-1)
i=(i+1+1)%n;//行归位(i+1)且下移(+1)
}
a[i][j]=count;//填入数据
}
for(i=0;i<n;i++){//输出方阵
printf("\n");
for(j=0;j<n;j++)printf("%4d",a[i][j]);
}
}
//二、当n为双偶数(n=4k)时魔方阵的算法
if(j>col+n-1)j=col;//若超过最后一列则放在第0列
if(a[i][j])i=ai+1,j=aj;//若数已存在,则放在前一元素的下方
a[i][j]=count;
}
}
void MagicDev(int a[M][M],int st,int n)//双偶(4K)阶魔方阵,起始数st
{
int i,j,g=st+n*n;//定义a+b=g为互补数
for(j=0;j<n;j源自文库+)
for(i=0;i<n;i++)
if(j%4==i%4||(j%4+i%4)==3)//每4×4对角线上元素
a[i][j]=g-a[i][j];//...换成其补数
for(i=0;i<n;i++){//输出方阵
printf("\n");
for(j=0;j<n;j++)printf("%4d",a[i][j]);
MagicOdd(a,0,m,2*m*m+1,m);//C阵(右上)
MagicOdd(a,m,0,3*m*m+1,m);//D阵(左下)
for(j=k;j<m-1;j++){//从A的中间格开始向右数k格...
t=a[k][j];
a[k][j]=a[k+m][j];//...与D对应位置交换
a[k+m][j]=t;
相关文档
最新文档