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