首页 > 试题广场 >

输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列

[问答题]

输出“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均

相等。例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

要求输出1n2

推荐

#include<stdio.h>

int main()

{int a[15][15],i,j,k,p,n;

p=1;

while(p==1)

{printf("enter n(n=1--15):");

scanf("%d”,&n);

if((n!=0) && (n<=15) && (n%2!=0))

p=0;

}

for(i=1;i<=n;i++)

for(j=1:j<=n;j++)

a[i][j]=0;

j=n/2+1;

a[1][j]=1;

for(k=2;k<=n*n;k++)

{i=i-1;

j=j+1;

if(i<1) && (j>n))

{i=i+2;

j=j-1:

}

else

{if(i<1)i=n;

if(j>n)j=1;

}

if(a[i][j]=0)

a[i][j]=k;

else

{i=i+2;

j=j-1;

[i][j]=k;

}

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

printf("%5d",a[i][j]);

printf("\n");

}

return 0;

}


发表于 2018-03-25 10:36:44 回复(0)
#include<stdio.h>
#include<stdlib.h>

void array(int n){
	int i,j,max,no;
	int *mtrx;
	if(n%2==0)	//如果n是偶数,则加1变奇数 
		n+=1;
	
	max=n*n;
	mtrx=(int *)malloc(max);	//为魔方阵分配内存 
	mtrx[n/2]=1;  //将1存入数组
	i=0;	//1所在行
	j=n/2;	//1所在***定从1之后每下一个数的位置,由当前数确定下一个数 
	for(int num=2;num<=max;num++){
		i=i-1;
		j=j+1;	//下一个数在当前数的上一行,右一列 
		
		if((num-1)%n==0){	//当前数是n的整倍数 
			i+=2;
			j-=1;
		}
		
		if(i<0)	//当前数在第0行时
			i=n-1; 
		
		if(j>n-1)	//当前数在最后一列
			j=0;
			
		no=i*n+j;	//下一个数在数组中的最终位置 
		mtrx[no]=num;
	} 
	//打印 
	printf("生成的%d魔方阵为:",n);
	no=0;
	for(i=0;i<n;i++){
		printf("\n");
		for(j=0;j<n;j++){
			printf("%3d",mtrx[no]);
			no++;
		}
	}
	free(mtrx);
} 
int main(){
	int n;
	printf("请输入n值:"); 
	scanf("%d",&n);
	array(n);
	return 0;
}

编辑于 2021-02-06 10:14:17 回复(0)
#include <stdio.h>
#define N 5//打印N阶魔方阵
int main()
{
    int a[N][N] = { 0 };//初始化数组
    int i, j,k;
    i = 0;//赋初值
    j = N/2+N%2-1;//j为第i行中间一列
    for (k = 1; k <= N*N; k++)//k为1~N*N的数
    {
        if (a[i][j] != 0)//判断该位置是否已经被占据
        {//该位置已经被占据,返回到上一个数的下面
            i = (i + 1) % N + 1;//此时i(行数)返回到上一个数的下一行
            j = (N + j - 1) % N;//j(列数)返回到上一个数的列数
        }
        //N为偶数时,右下角的元素的下一个元素经过上面的if判断,会返回到右下角的元素的下面,此时就会构成越界
        if (i == N)//判断i(行数)是否越界
        {//越界
            i--;//i(行数)返回到上一个数的行数
            j = (j + 1) % N;//j(列数)移到下一列
        }
        a[i][j] = k;
        i = (N+i-1)%N;//行数移到上一行,即2变成1,1变成0,0变成2
        j = (j + 1) % N;//列数移到下一列,2变成0,0变成1,1变成2
    }
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%-3d", a[i][j]);
        printf("\n");
    }
    return 0;
}
发表于 2022-04-24 11:34:50 回复(0)
/*魔方阵,古代又称“纵横图”,
是指组成元素为自然数1、2…n^2的n×n的方阵,
其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
    8   1   6
    3   5   7
    4   9   2  */
#include <stdio.h>
#include <stdlib.h>
int **magic_matrix(int n){
 int** matrix;
 int row = 0;
 int col = 0;
 matrix = (int**)malloc(sizeof(int* ) * n);//分配内存空间
 for(int i = 0; i < n; i ++){
  matrix[i] = (int *)malloc(sizeof(int) * n);
 }
 for(int i = 0; i < n; i ++){//初始化二维矩阵数组
  for(int j = 0; j < n; j ++){
   matrix[i][j] = 0;
  }
 }
 /*奇数阶魔方阵排列方法是:
 (1)将1放在第一行中间一列;
 (2)从2开始直到n×n止各数依次按下列规则存放;
每一个数存放的行比前一个数的行数减1,列数加1
(例如上面的三阶魔方阵,5在4的上一行后一列);
 (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);
例如1在第一行,则2应放在最下一行,列数同样加1;
 (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。
例如2在第3行最后一列,则3应放在第二行第一列;
 (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,
则把下一个数放在上一个数的下面。
 例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,
所以4就放在3的下面;*/
 if(n % 2 != 0){//依据提示奇数阶魔方阵排列方法排列
  int cnt = 1;//从1到n^2填数
  col = n / 2;//从第一行中间位置开始
  while(1){
   if(matrix[row][col] == 0){//意味着还没有填入数
    matrix[row][col] = cnt;
    cnt ++;
    row --;//行上移
    col ++;//列右移
   }
   else{//如果有数,那么回到前一个数字位置,并向其位置的下一格填入
    row = row + 2;
    col --;
   }
   if(row < 0)//行上移超了后,重置到最下面
    row = n + row;
   if(col < 0)//列左移超了后,重置到最右面
    col = n + col;
   if(row >= n)//行下移超了后,重置到最上面
    row = row - n;
   if(col >= n)//列右移超了后,重置到最左面
    col = col - n;
   if(cnt > n * n)//计数超了后结束循环
    break;
  }
 }
 /*偶数阶魔方阵排列方法是:*/
 else{
 }
 return matrix;
}
int main(){
 int n;
 scanf("%d", &n);
 int ** matrix = magic_matrix(n);
 for(int i = 0; i < n; i ++){
  for(int j = 0; j < n; j ++){
   printf("%d ", matrix[i][j]);
  }
  printf("\n");
 }
}
发表于 2019-12-31 01:00:09 回复(0)