<C语言>打印 n 阶魔方阵( n 为奇数),魔方阵的每一行、每一列和对角线元素之和都相等

打印魔方阵,首先我们得知道魔方阵的编写规律:

魔方阵的填充规律如下:
在这里插入图片描述
假设当前创建了一个矩阵:

int matrix[16][16];
  • 第一步,我们知道了,1是放在第一行中间一列,那么我们就可以在矩阵中放入1所在的位置
	//1、第一行的中间为1
	int mid = n / 2;
	matrix[0][mid] = 1;
  • 第二步,我们知道:最后一行的中间数字为n^2,其右边为2
	//2、最后一行的中间数字为n^2,其右边为2
	matrix[n - 1][mid] = n * n;
	matrix[n - 1][mid + 1] = 2;
  • 第三步,我们根据规律,使用if…else if…else语句进行不同条件的判断,对其实现不同的处理操作即可

注意事项:
1)用一个while循环进行矩阵的填充,因为1,2以及n^2 都已经填入,因此我们只要循环到3~n^2-1也填入矩阵中即可

2)除了当前元素处在第一行的最后一列以外,其它情况每次填充前都需要判断条件④中的④若按照上述规则确定的位置上已经放置有数,则下一位放在其下面,即[row + 1][column]

/*
	3、从2开始,各数依次按如下规则存放:
	①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
	②若当前数在第一行,则下一位在最后一行,列数同样加1,即[n-1][column+1]
	③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
	④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
	即在[0][n-1],则下一位放在其下面,即[row+1][n-1]
	*/

	//由于n*n已经确定,因此只需要放置3~n*n-1
	int finalNum = n * n - 1;
	int curNumber = 3;  //记录当前要填入的数字
	int row = n - 1;
	int column = mid + 1;
	//当前2所在的位置是[n-1][mid+1]
	while (curNumber <= finalNum)
	{

		//④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
		//即在[0][n - 1],则下一位放在其下面,即[row + 1][n - 1]
		if (row == 0 && column == n - 1)
		{
			row += 1;
			matrix[row][column] = curNumber++;
		}
		//②若当前数在第一行,则下一位在最后一行, 列数同样加1,即[n - 1][column + 1]
		else if (row == 0 && column!=n-1)
		{
			//考虑条件④
			if (matrix[n-1][column+1] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row = n - 1;
				column += 1;
			}
			matrix[row][column] = curNumber++;
		}
		//③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
		else if (column == n - 1 && row!=0)
		{
			//考虑条件④
			if (matrix[row-1][0] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row -= 1;
				column = 0;
			}
			matrix[row][column] = curNumber++;
		}
		//①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
		else
		{

			//考虑条件④
			if (matrix[row-1][column+1] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row -= 1;
				column += 1;
			}
			matrix[row][column] = curNumber++;
		}

	}

源代码:

/*
E26. 【二维数值数组】打印 n 阶魔方阵( n 为奇数)。魔方阵的每一行、每一列和对角线元素之和都相等。
*/
/*
3*3魔方阵如下:
8 1 6
3 5 7
4 9 2
*/
#include<stdio.h>

int matrix[16][16];

void printMagicSquare(int n);
void printMatrix(int n);
int main()
{
	int n;
	printf("请输入一个奇数:");
	scanf_s("%d", &n);

	printf("打印%d阶魔方阵为:\n",n);
	printMagicSquare(n);

	system("pause");
}

void printMagicSquare(int n)
{
	//1、第一行的中间为1
	int mid = n / 2;
	matrix[0][mid] = 1;

	//2、最后一行的中间数字为n^2,其右边为2
	matrix[n - 1][mid] = n * n;
	matrix[n - 1][mid + 1] = 2;

	/*
	3、从2开始,各数依次按如下规则存放:
	①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
	②若当前数在第一行,则下一位在最后一行,列数同样加1,即[n-1][column+1]
	③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
	④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
	即在[0][n-1],则下一位放在其下面,即[row+1][n-1]
	*/

	//由于n*n已经确定,因此只需要放置3~n*n-1
	int finalNum = n * n - 1;
	int curNumber = 3;  //记录当前要填入的数字
	int row = n - 1;
	int column = mid + 1;
	//当前2所在的位置是[n-1][mid+1]
	while (curNumber <= finalNum)
	{

		//④若按照上述规则确定的位置上已经放置有数,或当前数在第一行最后一列,
		//即在[0][n - 1],则下一位放在其下面,即[row + 1][n - 1]
		if (row == 0 && column == n - 1)
		{
			row += 1;
			matrix[row][column] = curNumber++;
		}
		//②若当前数在第一行,则下一位在最后一行, 列数同样加1,即[n - 1][column + 1]
		else if (row == 0 && column!=n-1)
		{
			//考虑条件④
			if (matrix[n-1][column+1] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row = n - 1;
				column += 1;
			}
			matrix[row][column] = curNumber++;
		}
		//③若当前数在最后一列,则下一位的列数为1,行数同样减1,即[row-1][0]
		else if (column == n - 1 && row!=0)
		{
			//考虑条件④
			if (matrix[row-1][0] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row -= 1;
				column = 0;
			}
			matrix[row][column] = curNumber++;
		}
		//①每个数的下一位在其右上方,即行数减1,列数加1,即[row-1][column+1]
		else
		{

			//考虑条件④
			if (matrix[row-1][column+1] != 0)
			{
				row += 1;
				//matrix[row][column] = curNumber++;
			}
			else
			{
				row -= 1;
				column += 1;
			}
			matrix[row][column] = curNumber++;
		}

	}

	//打印矩阵
	printMatrix(n);

}

void printMatrix(int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d  ", matrix[i][j]);
		}
		printf("\n");
	}
}

运行结果:

  • 3阶魔方阵:
    在这里插入图片描述

  • 5阶魔方阵
    在这里插入图片描述

  • 7阶魔方阵
    在这里插入图片描述

欢迎友好的指正。

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值