奇数幻方构造

本文介绍如何构造奇数阶幻方,以n=3为例,详细阐述幻方构造的口诀和步骤:1. 数字1置于中央;2. 依序填入上一数的右上角,遇边界回转。并给出n=3的幻方实例及代码实现,关注二维数组的动态内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。

思想:

 n奇数幻方口诀:
1. 数字1放在第一行中间
2. 依次放在上一个数的右上角
2.1如果右边出去了就回到左边(3,4)
2.2 如果上面出去了就放下面(1,2)
2.3 如果右上角有了就放在这个数的下面(参考5,6)
例如:n=3
8     1     6
3     5     7
4     9     2

注意:

二维数组的动态申请与释放的方法

代码:

#include <iostream>
#include <stdlib.h>
using namespace std;

void sudoku(int n)
{
	
	/*动态申请一个二维数组*/
	int **ptr;
	ptr= new int *[n];
	for (int i = 0; i < n; i++)
	{
		ptr[i] = new int[n];
	}
	/*对二维数组做初始化操作*///注意此处不能使用memset函数初始化,因为采用上述方法申请的二维数组是由n的不连续的n大小的空间组成的。

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			ptr[i][j] = 0;
		}
	}
	//memset(ptr, 0, n*n);
	
	int i = 0; 
	int j = n / 2;
	ptr[i][j] = 1;
	for (int k = 2; k <= n*n; k++)
	{
		int i1, j1;
		i1 = i; //记录当前的i,j以免右上角已经有数,直接放在当前数的下方
		j1 = j; //
		i--;
		j++;
		if (i < 0 )//如果上面出去了就放下面
		{
			i = n - 1;
		}
		if (j >( n - 1))//如果右边出去了就回到左边
		{
			j = 0;
		}

		if (ptr[i][j]!=0)//如果右上角有了就放在这个数的下面
		{
			ptr[i1 + 1][j1] = k;
			i = i1+1;//注意更新i,j的值
			j = j1;
		}
		else if (ptr[i][j]==0)
		{
			ptr[i][j] = k;
		}
	}

	for (int i = 0; i < n; i++)//输出
	{
		for (int j = 0; j < n; j++)
		{
			cout << ptr[i][j] << " ";
		}
		cout << endl;
	}

	for (int i = 0; i < n; i++) //释放内存
	{
		delete[] ptr[i];
	}
	delete ptr;
}

int main()
{
	int n;
	cin >> n;
	sudoku(n);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值