描述
显示n阶幻方。
n阶幻方就是把1到n*n填入到n行h列的矩阵中,每一行,每一列,两条对角线上的数据和都是相同的。
输入
输入只有1个数n。1<=n<=11且n是奇数。
输出
输出n阶的幻方
样例输入
3
样例输出
8 1 6
3 5 7
4 9 2
提示
N 为奇数时:
方法一:
- 将1放在第一行中间一列;
- 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1 - 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1; - 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
方法二:
错位补角编辑 1.对于所有的奇阶幻方,1-nn从小到大填入nn的方格中。以n=5时,1-25为例。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
2.横错位,将方格横向错位,每行错位数为 n-行数,即第一行横向移动n-1位,第二行横向移动n-2位…直到形成一个左低右高的楼梯。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
3.横补角,以中间行为基准,将突出的数字补回本行所缺的方格内,4,5补到1的前,10补到6前,16补到20后,21,22补到25后。从而重新得到一个n*n方格。
4 5 1 2 3
10 6 7 8 9
11 12 13 14 15
17 18 19 20 16
23 24 25 21 22
4.竖错位,将方格纵向错位,每列错位数为 n-列数,即第一列横向移动n-1位,第二列横向移动n-2位…直到形成一个左低右高的楼梯。
3
2 9
1 8 15
5 7 14 16
4 6 13 20 22
10 12 19 21
11 18 25
17 24
23
5.竖补角,以中间列为基准,将突出的数字补回本列所缺的方格内,17,23补到4上,24补到5上,2补到21下,3,9补到22下。从而重新得到一个n*n方格,及得到结果。
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
结语:错位补角可以先横后竖,也可以先竖后横。楼梯可以左低右高,也可以左高右低。只要保证横竖做出的楼梯方向相同,就能得到正确结果。一共可以求出4个答案。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n,a[20][20],i,j,m;
scanf("%d",&m);
for(n=1,i=0,j=m/2;n<=m*m&&m%2!=0;)
{
a[i][j]=n;
if(n%m!=0)
{ i--;
if(i<0) i=m-1;
j++;
if(j==m) j=0;
}
else
{ i++;
if(i==m) i=0;
}
n++;
}
for(i=0;i<m;i++,printf("\n"))
for(j=0;j<m;j++)
printf("%d ",a[i][j]);
return 0;
}