传说,大禹治水时,从洛河里爬出一只大乌龟,背上有一些奇妙的标记。人们仔细辨认后,发现原来是一些极有规律的数字:它的纵、横、斜每一列每一行三个数字的和都是15!
中国古书上称这个纵横图为‘洛书’,后来研究者多称它为“幻方(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
类似的可以构造其它奇数阶的幻方。
输入:
要求的奇数阶幻方的阶数
输出:
按照上述方法构造出来的幻方,两个元素之间用逗号","隔开,每行行尾进行换行。
范例输入:
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] + ",");
}
}
}
}
}