N宫格填数——Java版本

酶和ATP 2022年09月18日 416次浏览

陈老师留的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