“魔方阵“c语言实现,奇数型

【问题描述】
"魔方阵"是指一个AN*N矩阵(在本题中N仅为奇数,且N>1),以自然数1,2, 。。。 N2为元素进行填充,每个位置上分别放置一个元素,使每行、每列以及主、副对角线上的元素之和都相等。
如3*3魔方阵,图在每行、每列、主对角线、副对角线上元素之和均为15:
8  1  6
3  5  7
4  9  2
奇数阶魔方阵的生成算法如下,初始矩阵A为空,从1开始依据下面的规则依次放置各个自然数(注意在下面的叙述中各元素行、列下标均以1-N计数):
1.         将1放在第一行正中的位置,即A[1, (j+1)/2];
2.         设最后放置的元素是A[i, j],则将下一个元素放在最后一个插入位置的右上方,即A[i-1, j+1]。但如果该位置已超出方阵的上边界(即如果i<0),则新位置取该列的最下一个位置,即A[N, j+1];如果该位置已超出方阵的右边界,取新位置取该行的最左一个位置,即A[i-1, 1]。
3.         若最近一个插入元素为N的整倍数,则新位置取最后插入元素下面的位置,即A[i+1, j]。
输入一个奇数N,打印对应的N阶魔方阵。
【输入形式】

控制台输入一奇数N。
【输出形式】

输出一个N*N的魔方阵,其中每个数字占4位字符的宽度,向右对齐。
【样例输入】

5

【样例输出】

  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9

【样例说明】

输入奇数5,输出5阶魔方阵。

看题目与样例输出,可以得出规律,从1开始到n*n,每个数都在上个数的右上角,墙有穿透性,如果右上角已经被赋值则下个数向下走一格;

如此可以得出

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void mofang(int n){
	int a[100][100]={0},i,q=0,p=0,j,_q,_p;
	p=(n+1)/2-1;
	//将1放在第一行正中的位置,即a[0, (j+1)/2-1];
	a[q][p]=1;
	for(i=2;i<=n*n;i++){
		_q=q;//保存一开始的值
		_p=p;
//在对角情况
		if(q==0&&p==n-1){
			q=n-1;
			p=0;
		}
//在第一行边界情况
		else if(q==0){
			q=n-1;
			p=p+1;
		}
//在最后一列边界
		else if(p==n-1){
			q=q-1;
			p=0;
		}
//普通情况
		else{
			q--;
			p++;
		}
//如果他的右上方被占领
		if(a[q][p]!=0&&q==n-2){
			q=0;
			p=_p;
		}
		else if(a[q][p]!=0){
			q=_q+1;
			p=_p;
		}
		a[q][p]=i;
	}
//输出
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
} 
int main(int argc, char *argv[]) {
	int n;
	scanf("%d",&n);
	mofang(n);
	return 0;
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值