幻方问题

来源:互联网 发布:sql语句的关键字 编辑:程序博客网 时间:2024/04/29 02:49

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

 

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

4   9   2
3   5   7
8   1   6

 

输入:

要求的奇数阶幻方的阶数

输出:

按照上述方法构造出来的幻方,两个元素之间用逗号","隔开,每行行尾进行换行。

 

范例输入:

5

范例输出:

11,18,25,2,9

10,12,19,21,3

4,6,13,20,22

23,5,7,14,16

17,24,1,8,15


________________________________________________________________________________________

解答:

import java.util.*;
public class Main43 {
            public static void main(String args[]) throws Exception {
        Scanner cin=new Scanner(System.in);
        int N = cin.nextInt();
        int line_row;
        int line_column;
       
        int[][] magic = new int[N][N];
        line_row = N - 1;
        line_column = N/2;
        for(int i = 0; i < N * N; i++){
        if(i == 0){
        magic[line_row][line_column] = 1;
        continue;
        }
        int tmp_row = line_row;
        int tmp_col = line_column;
        line_row = line_row + 1;
        line_column = line_column + 1;
        tmp_row = tmp_row - 1;
        if(tmp_row < 0){
        tmp_row = N - 1;
        }
        if(line_row == N){
        line_row = 0;
        }
        if(line_column == N){
        line_column = 0;
        }
       
        if(magic[line_row][line_column] != 0){
        line_row = tmp_row;
        line_column = tmp_col;
        }
       
        magic[line_row][line_column] = i + 1;
        }
       
        for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
        if(j == N-1){
        System.out.print(magic[i][j] + "\n");
        }else{
        System.out.print(magic[i][j] + ",");
        }
        }
        }
            }
}

原创粉丝点击