奇阶幻方

描述

显示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. 将1放在第一行中间一列;
  2. 从2开始直到n×n止各数依次按下列规则存放:
    按 45°方向行走,如向右上
    每一个数存放的行比前一个数的行数减1,列数加1
  3. 如果行列范围超出矩阵范围,则回绕。
    例如1在第1行,则2应放在最下一行,列数同样加1;
  4. 如果按上面规则确定的位置上已有数,或上一个数是第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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值