<无聊>构造奇数次幻方

应该知道幻方是什么东西吧?不知道也没关系,我帮你百度一下,你就知道了。(*^__^*) 嘻嘻……

幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

也就是说一个n*n的格子填上1~n这n*n个数,使每一行每一列再加上斜行都等于相同的数。记得看射雕英雄传的时候看到这个幻方的来源。当时困扰了瑛姑10几年的数学难题就是这个幻方,没想到被我国古代杰出的数学家,园林学家,音乐家,老人家黄药师的女儿黄蓉给轻松破解了。真是哈哈哈哈。。。

好吧。无聊写了求n=奇数时的幻方,这个在小学的时候有学到过。后来在组合数学上第一章也有讲到,不过求偶数的幻方规律我还不会,有空再看看,嘎嘎嘎嘎。。。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
#include <ctime>
#define LL __int64
#define EPS 1e-8
using namespace std;
int a[1000][1000];
int n,i,j;
int main()
{
	while (~scanf("%d",&n) && n)
	{
		if (n % 2==0) 
		{
			printf("请输入奇数,ok?\n");
			continue;
		}
		memset(a,0,sizeof(a));
		a[1][n/2+1]=1;
		int s=2;
		int x=1,y=n/2+1;
		while (s<=n*n)
		{
			x-=1;
			y+=1;
			if (x==0 && y==n+1)
			{
				x=2;y=n;
			}
			else if (x==0) x=n;
			else if (y==n+1) y=1;
			if (a[x][y])
			{
				x+=2;
				y-=1;
			}
			a[x][y]=s++;
		}
		for (i=1;i<=n;i++)
		{
			for (j=1;j<=n;j++)
				printf("%4d",a[i][j]);
			printf("\n");
		} 
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值