洛书

来源:互联网 发布:超级舰队老僧扫矿软件 编辑:程序博客网 时间:2024/09/21 08:49

http://210.38.224.114:808/JudgeOnline/problem.php?id=1295


相当无奈的题目,最后写出来没能交,

用sleeps一步步找哪里错了,太浪费时间,考虑清楚向上应该行数-1不是+1,最后,不要着急交,检查下头文件,输入输出。

vis标记,0,-1走过。


Description

 洛书:传说有神龟出于洛水,其甲壳上有此图象,结构是戴九履一,左三右七,二四为肩,六八为足,以五居中,五方白圈皆阳数,四隅黑点为阴数。

洛书上的点,无论横、竖、对角线的点数相加都是等于15。我们对洛书进行一下变化,便得到了一个3阶幻方。

8

1

6

3

5

7

4

9

2

它的每行,每列和两条对角线上元素的和相等。对于n阶幻方(n为奇数),我们有一种构造方法——连续摆数法。下面是用连续摆数法生成的5阶和7阶幻方。

5阶幻方:

17

24

1

8

15

23

5

7

14

16

4

6

13

20

22

10

12

19

21

3

11

18

25

2

9

 

7阶幻方:

30

39

48

1

10

19

28

38

47

7

9

18

27

29

46

6

8

17

26

35

37

5

14

16

25

34

36

45

13

15

24

33

42

44

4

21

23

32

41

43

3

12

22

31

40

49

2

11

20

把“1”放在中间一列最上边的方格中,从它开始,按对角线方向(比如说按从左下到右上的方向)顺次把由小到大的各数放入各方格中,如果碰到顶,则折向底,如果到达右侧,则转向左侧,如果进行中轮到的方格中已有数或到达右上角,则退至前一格的下方。生成5阶幻方的过程如下图所示:

Input

 测试数据有多组,第一行为一个整数T,表示有T组测试数据。每组数据占一行,包含一个奇数n,表示需要生成一个n阶幻方(3 ≤ n ≤ 21)。

Output

 输出用连续摆数法生成的n阶幻方,每个数占5格,右对齐,每组数据后输出一个空行。

Sample Input

235

Sample Output

    8    1    6    3    5    7    4    9    2   17   24    1    8   15   23    5    7   14   16    4    6   13   20   22   10   12   19   21    3   11   18   25    2    9

HINT


#include <stdio.h>#include <string.h>#include<iostream>#include<cstring>using namespace std;int a[30][30],vis[30][30];void shu(int m){for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){printf("%5d",a[i][j]);}cout<<endl;}/*for(int i=0;i<=m+1;i++){for(int j=0;j<=m+1;j++){cout<<vis[i][j]<<" ";}cout<<endl;}cout<<endl;*/}int main(){int n;cin>>n;while(n--){int m;cin>>m;for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){a[i][j]=1;vis[i][j]=0;}}for(int i=0;i<=m+1;i++){vis[0][i]=1;vis[i][0]=2;vis[m+1][i]=4;vis[i][m+1]=3;}int ss=(m+1)/2;int s=1;vis[s][ss]=-1;int x=0;for(;;){if(vis[s-1][ss+1]==1){a[s+m-1][ss+1]+=a[s][ss];s=s+m-1;ss=ss+1;vis[s][ss]=-1;x++;}if(vis[s-1][ss+1]==3){a[s-1][ss-m+1]+=a[s][ss];ss=ss-m+1;s=s-1;vis[s][ss]=-1;x++;}if(vis[s-1][ss+1]==-1){a[s+1][ss]+=a[s][ss];s=s+1;vis[s][ss]=-1;x++;}if(vis[s-1][ss+1]==0){a[s-1][ss+1]+=a[s][ss];s=s-1;ss=ss+1;vis[s][ss]=-1;x++;}if(s==1&&ss==m){a[s+1][ss]+=a[s][ss];s=s+1;vis[s][ss]=-1;x++;}if(x==m*m){break;}}shu(m);if(n>=1)cout<<endl;}}




0 0
原创粉丝点击