陈老师留的Java课后思考题,感觉挺好玩。
顺便学习一下 STL 的用法。
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
int n = (int) (Math.random() * 5) * 2 + 3;
System.out.printf("随机一个奇数n = %d\n", n);
System.out.println("************************");
int[][] matrix = new int[n][n];
// 1. 先填入 1
int cnt = 1;
int i = 0, j = n / 2;
matrix[i][j] = cnt++;
// 2. 填入2 ~ n^2
while (cnt <= n * n) {
// 先填右上角
i = (i - 1 + n) % n;
j = (j + 1) % n;
// 如果有数了,就填到原数的下面
if (matrix[i][j] != 0) {
i = (i + 2) % n;// 下面一行
j = (j - 1 + n) % n;// 原来的列
}
matrix[i][j] = cnt++;
}
// print
for (int ii = 0; ii < n; ii++) {
for (int jj = 0; jj < n; jj++) {
System.out.printf("%4d", matrix[ii][jj]);
}
System.out.println();
}
System.out.println("************************");
if (check(matrix, n)) {
System.out.println("填数正确");
} else {
System.out.println("填数错误");
}
}
private static boolean check(int matrix[][], int n) {
System.out.println("**********check*********");
Set<Integer> set = new HashSet<>();
for (int ii = 0; ii < n; ii++) {
int sum = 0;
for (int jj = 0; jj < n; jj++) {
sum += matrix[ii][jj];
}
set.add(sum);
System.out.printf("第 %d 行的和为 %d\n", ii + 1, sum);
}
System.out.println("************************");
for (int jj = 0; jj < n; jj++) {
int sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][jj];
}
set.add(sum);
System.out.printf("第 %d 列的和为 %d\n", jj + 1, sum);
}
System.out.println("************************");
int sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][ii];
}
set.add(sum);
System.out.printf("主对角线的和为 %d\n", sum);
System.out.println("************************");
sum = 0;
for (int ii = 0; ii < n; ii++) {
sum += matrix[ii][n - ii - 1];
}
set.add(sum);
System.out.printf("副对角线的和为 %d\n", sum);
System.out.println("************************");
if (set.size() == 1) {
return true;
} else {
return false;
}
}
}
感谢:https://wenku.baidu.com/view/287eae9b7d1cfad6195f312b3169a4517623e552.html