南师C:输出魔方阵

前言

这道题目是输出魔方阵,在这之前我并不清楚魔方阵是什么东西,查阅了一些资料,大概清楚了它的概念。本文适用于奇数矩阵。

正文

概念

由 NxN个数字所组成的n阶方阵,若具有各对角线、各横列与纵行的数字和都相等的性质,则称为魔方阵。这个相等的和称为魔术数字。若填入的数字是从1到NxN,称此种魔方阵为n阶正规魔方阵。
如下所示为一个5阶魔方阵。
在这里插入图片描述

步骤

假定当前数的下标为(i,j),先确定1所在的位置,把1放到顶行的正中间,接着把后面的数继续按顺序放置在魔方阵中,魔方阵的构建方法要遵循以下顺序

  1. 当前数是n的倍数:则将下一个数直接放置在当前位置的正下方
  2. 当前数在第0行:则将下一个数放置在最后一行的下一列上
  3. 当前数在最后一列:即n-1列:则将下一个数放置在上一行的第一列上
  4. 除以上情况外:则下一个数放置的位置为当前位置的右上方

代码(二维数组)

#include <stdio.h>
#include <stdlib.h>
int MagicSquare(int n);
int main()
{
	int n;
	scanf("%d",&n);
	MagicSquare( n);
	return 0;
}
int MagicSquare(int n){
	int max,num,i,j;
	int **mtr;
	 /*为魔方阵分配内存*/
	mtr=(int **)malloc(sizeof(int*)*n);
	for(i=0;i<n;i++){
		mtr[i]=(int*)malloc(sizeof(int)*n);
	}
	max=n*n;
	i=0;
	j=n/2;
	mtr[i][j]=1;/*自然数1所在列*/
	for(num=1;num<max;num++){
		if(num%n==0){/*当前数是n的倍数*/
			i=i+1;
		}
		else if(i==0){/*当前数在第0行*/
			i=n-1;
			j++;
		}
		else if(j==n-1){/*当前数在最后一列,即n-1列*/
			i=i-1;
			j=0;
		}
		else{
			i=i-1;
		    j=j+1;
		}
		mtr[i][j]=num+1;
	}
	printf("打印魔方阵\n");5;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%3d ",mtr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	free(mtr);
	return 0;
} 

注意:需要注意二维数组(指向指针的指针)malloc的过程,两次malloc

代码二(一维数组)

#include <stdio.h>
#include <stdlib.h>
int MagicSquare(int n);
int main()
{
	int n;
	scanf("%d",&n);
	MagicSquare( n);
	return 0;

}
int MagicSquare(int n){
	int max,no,num,i,j;
	int *mtr;
	max=n*n;
	mtr=(int*)malloc(sizeof(int)*max);
	mtr[n/2]=1;
	i=0;
	j=n/2;
	for(num=1;num<max;num++){
		if(num%n==0){/*当前数是n的倍数*/
			i=i+1;
		}
		else if(i==0){/*当前数在第0行*/
			i=n-1;
			j++;
		}
		else if(j==n-1){/*当前数在最后一列,即n-1列*/
			i=i-1;
			j=0;
		}
		else{
			i=i-1;
		    j=j+1;
		}
		no=i*n+j;
		mtr[no]=num+1;
	}
	printf("打印魔方阵\n");
	no=0;
	for(i=0;i<n;i++){
		printf("\n");
		for(j=0;j<n;j++){
			printf("%3d ",mtr[no]);
			no++;
		}
	}
	printf("\n");
	free(mtr);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值