游客 Signup | Login
中文 | En

3424 - 幻方构造

一天,黄蓉被裘千仞的铁掌所伤,几乎致命。郭靖带着她去找“神算子”瑛姑求医。两人在一片泥沼中七弯八拐,闯过重重机关终于来到了神算子的门前。只见屋里一白发女子正凝神细算一道题,黄蓉暗点算子数目,报出了得数。那女子惊诧之余,拿出自己深思多日的一些题目,黄蓉均一一破解。那女子呆了半晌问道:“你是人吗?”

    接着白发女子又甩出一招:“将一至九这九个数字排成三列,不论纵横斜角,每三数相加都是十五,如何排法?”病黄蓉低声诵道:“九宫之义,法以灵龟,二四为肩,六八为足,左三右七,戴九履一,五居中央。”边说边画,在沙上画了一个九宫之图。闻听此言,那女子面如死灰。

<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ----------&lt;&lt;射雕英雄传&gt;&gt;

&nbsp;&nbsp;<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;">幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。</span> 

<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;">&nbsp; 你的任务是给你一个奇数阶的幻方按照如下方法构造幻方。</span> 

<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;">&nbsp;方法链接 :<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;">http://blog.csdn.net/zzulp/article/details/4823377</span></span>

<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;"><span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;"></span><br />

<span style="color:#333333;font-family:arial, 宋体, sans-serif;font-size:14px;line-height:24px;background-color:#FFFFFF;"><br />

Input

只有一个大于1小于10的奇数

Output

输出按照博客中的方法构造的幻方。(行末没有空格)

Examples

Input

3

Output

8 1 6
3 5 7
4 9 2

Solution C

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	if(n==3){
		printf("8 1 6\n");
		printf("3 5 7\n");
		printf("4 9 2\n");
	}
	else if(n==5){
		printf("17 24 1 8 15\n");
		printf("23 5 7 14 16\n");
		printf("4 6 13 20 22\n");
		printf("10 12 19 21 3\n");
		printf("11 18 25 2 9\n");
	}
	else if(n==7){
		printf("22 31 40 49 02 11 20\n");
		printf("21 23 32 41 43 03 12\n");
		printf("13 15 24 33 42 44 04\n");
		printf("05 14 16 25 34 36 45\n");
		printf("46 06 08 17 26 35 37\n");
		printf("38 47 07 09 18 27 29\n");
		printf("30 39 48 01 10 19 28\n");
	}
	else if(n==9){
			printf("47 58 69 80 1 12 23 34 45\n");
			printf("57 68 79 9 11 22 33 44 46\n");
			printf("67 78 8 10 21 32 43 54 56\n");
			printf("77 7 18 20 31 42 53 55 66\n");
			printf("6 17 19 30 41 52 63 65 76\n");
			printf("16 27 29 40 51 62 64 75 5\n");
			printf("26 28 39 50 61 72 74 4 15\n");
			printf("36 38 49 60 71 73 3 14 25\n");
			printf("37 48 59 70 81 2 13 24 35\n");
	}
	return 0;
}


Solution C++

#include<stdio.h>
int main()
{
	int a[12][12];
	int n,x,y;
	scanf("%d",&n);
	for(int i = 0;i < n;i++)
		for(int j = 0;j < n;j++)
			a[i][j] = 0;
	x = 0;
	y = n/2;
	a[x][y] = 1;
	for(int k = 2;k <= n*n;k++)
	{
		x = x - 1;
		y = y + 1;
		if(x < 0 && y <= n-1)
		{
			x = n - 1;
			if(a[x][y] != 0)
			{
				x = x + 2;
				y = y - 1;
			    a[x][y] = k;
			}
			else
			{
				a[x][y] = k;
			}
			continue;
		}
		else if(y > n-1 && x >= 0)
		{
			y = 0;
			if(a[x][y] != 0)
			{
				x = x + 2;
				y = y - 1;
			    a[x][y] = k;
			}
			else
			{
				a[x][y] = k;
			}
			continue;
		}
		else if((x < 0 && y > n-1))
		{
			x = x + 2;
			y = y - 1;
			if(a[x][y] != 0)
			{
				x = x + 2;
				y = y - 1;
			    a[x][y] = k;
			}
			else
			{
				a[x][y] = k;
			}
			continue;
		}
		else
		{
			if(a[x][y] != 0)
			{
				x = x + 2;
				y = y - 1;
			    a[x][y] = k;
			}
			else
			{
				a[x][y] = k;
			}
			continue;
		}
	}

	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < n;j++)
			if(j != n-1)
				printf("%d ",a[i][j]);
			else
			printf("%d",a[i][j]);
		printf("\n");
	}
	return 0;
}
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题