【C语言典例】——day3:设计魔方阵(数组)

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入刷题模式。若有错误,请多多指教。

👍 点赞  收藏 📝留言 都是我创作的最大的动力!


目录

 魔方阵(magic matrix)

题目描述:

 问题分析:

程序源码:

运行结果:

举一反三: 


 

 魔方阵(magic matrix)

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2、…、n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

幻方,有时又称魔方(该称呼现一般指立方体的魔术方块)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从1到N2的连续整数组成,其中N为正方形的行或列的数目。因此 N阶幻方有N行N列,并且所填充的数为从1到N2。 [1] 

幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数

  ,如果填充数为1,2,……,N^2。

 ,那么有

 

⒈何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既方便,又直观。

⒉何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有n*n个小方格,则称这个方阵是一个n阶方阵。

⒊何谓魔方阵? 定义:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。

⒋最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背上各负有一图,只有大禹才可指挥其中之由龙马负出的为河图,出自黄河;另一由理龟负出的洛书出自洛河

⒌最早的四阶魔方阵相传是刻在印度一所庙宇石上,年代大约是十一世纪。古代印度人十分崇拜这种幻方,至今从古神殿的遗址,墓碑上常常还可以发现四阶幻方的遗迹。

⒍欧洲最早的魔方阵是公元1514年德国画家Albrecht Dure在他著名的铜板画Melencolia上的4×4幻方,有趣的是,他连创造年代(1514)也镶在这个方阵中,而且上下左右,四个小方阵的和皆为34,是欧洲最古老的幻方。

题目描述:

打印5阶幻方即它的每一行,每一列和对角线之和均相等。

 问题分析:

(1)将1放在第一行中间一列。

(2)从2开始直到25各数依次按:

(3)每一个数存放的行比前一个数的行数减1,列数加1.

(4)如果上一个数的行数为1,则下一个数的行数为5,列数加1。

(5)当上一个数的列数为5时,下一个数的列数应为1,行数减1.

(6)如果按上面步骤确定的位置上已经有数(本题中不为0),或者上一个数是第1行第5列时,则把下一个数放在上一个数的下面。

程序源码:

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

int main()
{
	system("COLOR FD");    //改变字体背景颜色
	int i, j, a[6][6] = { 0 };
	int x = 1, y = 3;		//1的位置
	for (i = 1; i <= 25; i++)
	{
		a[x][y] = i;
		if (1 == x && 5 == y)
	//上一个数是第一行第五列时,则把下一个数放在它的下面
		{
			x += 1;
			continue;	//结束本次循环
		}
		if (1 == x)
			x = 5;	//当上一个数是第一行时,下一个数是第五行。
		else
			x--;	//否则行数减一。
		if (5 == y)
			y = 1;	//当上一个数是第五列时,下一个数是第一列。
		else
			y++;	//否则列数加一。
		if (a[x][y] != 0)	//判断经过上面步骤确定的位置是否有非零数。
		{
			x = x + 2;		//条件为真行数加二,列数减一。
			y = y - 1;
		}
	}
	for (i = 1; i < 6; i++)		//输出二维数组
	{
		for (j = 1; j < 6; j++)
			printf("%4d", a[i][j]);
		printf("\n");
	}

	return 0;
}

运行结果:

举一反三: 

在本程序的基础上编程实现输入n阶幻方,n的值由用户从键盘中输入。

 

 

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学〖森〗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值