(C++)幻方问题(纵横图)

将1n^2放在nnn为奇数) 的方阵中,使得任意一行任意一列以及两条对角线上的所有元素之和均相等。如n=5时的方阵如下图所示。

15

24

17

16

14

7

23

22

20

13

6

4

3

21

19

12

10

9

2

25

18

11

这一问题如果采用试探的方法,在n值较大时,将难以求出,因为可能的状态数是n^2!个。经典的构造方法如下:

将数1 放在第一行的中间元素, 然后往左上的位置上放入下一个数。 

若左上的位置已有数,则将其放入该数的下一行中的同一列的位置上。

若已是最左或最上面位置上的元素,则其下一个位置的寻找方法是: 将方阵卷成一个纸筒,然后依此再按同样的方向再找下一个位置,直到n×n个元素全部放入为止。  

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	cout<<"几阶幻方?《请输入一个奇数》 "<<endl;
	int n;
	cin>>n;
	int magic[n][n];
	//首先是第一行中间的是1
	int x = 0;
	int y = n/2;
	int value = 1;
	magic[x][y]=value;
	while(value < n*n + 1){
		magic[x][y] = value;		
		if(value%n != 0){
			x = (x+n-1)%n;
			y = (y+n-1)%n;
		}else{
			x = (x+1)%n;
		}
		value++;
	}
	cout<<"输出纵横图为:"<<endl; 
	//输出数组
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout<<magic[i][j]<<"\t";
		}
		cout<<endl;
	} 
	
}

运行结果:

几阶幻方?《请输入一个奇数》
5
输出纵横图为:
15      8       1       24      17
16      14      7       5       23
22      20      13      6       4
3       21      19      12      10
9       2       25      18      11

--------------------------------

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值