洛书
来源:互联网 发布:超级舰队老僧扫矿软件 编辑:程序博客网 时间: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