NO.3幻方问题

传说,大禹治水时,从洛河里爬出一只大乌龟,背上有一些奇妙的标记。人们仔细辨认后,发现原来是一些极有规律的数字:它的纵、横、斜每一列每一行三个数字的和都是15!

LuoShumagic cub

中国古书上称这个纵横图为‘洛书’,后来研究者多称它为“幻方(magic square)”。它变幻莫测,趣味无穷。

n阶的幻方表示一个n阶矩阵,它共有N2个元素,每个元素分别取值1~N2不重复,它的各行,各列,以及对角线之和都相等。

对于奇数阶的幻方构造,有一个简单的方法:
  • 把1放置在最后一行的中间。
  • 顺序将2,3,4,...等数放在右下的方格中。
  • 当右下方格出界的时候,则由另一边进入。
  • 当右下方格中已经填有数,则把数填入正上方的方格中。
  • 按照以上步骤直到填写完所有N2个方格。

以3阶幻方为例,

1填写在(3,2)(第三行第2列)的位置上;

2应当填写在其右下方格中,由于往下已经超出界限,因此变成位置(1,3);

3应该填写的位置往右往下都超出了界限,因此填入位置是(2,1);

4应放的位置被占了,因此放在3的上方位置(1,1);

5、6都按照规则放在其右下方格位置(2,2),(3,3);

7放在6的上方位置(2,3);

8因为右边越界,放在(3,1);

9放入(1,2);

4   9   2

3   5   7

8   1   6

类似的可以构造其它奇数阶的幻方。

01.import java.util.*;  
02./* 
03. * 幻方 
04. */  
05.public class Main {  
06.    public static void main(String args[]) throws Exception {  
07.        Scanner cin = new Scanner(System.in);  
08.        //输入阶数  
09.        int n = cin.nextInt();  
10.        //如果是偶数阶则返回  
11.        if (n % 2 == 0) {  
12.            return;  
13.        }  
14.        //定义幻方二维数组  
15.        int[][] arr = new int[n][n];  
16.        //定义行,列位置  
17.        int row = n - 1, col = n / 2;  
18.        for (int i = 1; i <= n * n; i++) {  
19.            //循环给数组赋值  
20.            arr[row][col] = i;  
21.            row++;  
22.            col++;  
23.            //定义幻方行列是否越界真假  
24.            Boolean rflag = false;  
25.            Boolean cflag = false;  
26.            if (row == n) {  
27.                rflag = true;  
28.                row = 0;  
29.            }  
30.            if (col == n) {  
31.                cflag = true;  
32.                col = 0;  
33.            }  
34.            if (arr[row][col] != 0) {  
35.                if (rflag) {  
36.                    row = n - 1;  
37.                } else {  
38.                    row--;  
39.                }  
40.                if (cflag) {  
41.                    col = n - 1;  
42.                } else {  
43.                    col--;  
44.                }  
45.                row--;  
46.            }  
47.        }  
48.        for (int i = 0; i < n; i++) {  
49.            for (int j = 0; j < n; j++) {  
50.                System.out.print(arr[i][j]);  
51.                if (j != n - 1) {  
52.                    System.out.print(",");  
53.                }  
54.            }  
55.            System.out.println();  
56.        }  
57.    }  
58.} 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值