请在 n × n 的棋盘上,实现一个判定井字棋(Tic-Tac-Toe)胜负的神器,判断每一次玩家落子后,是否有胜出的玩家。
    在这个井字棋游戏中,会有 2 名玩家,他们将轮流在棋盘上放置自己的棋子。
    在实现这个判定器的过程中,你可以假设以下这些规则一定成立:

    1 . 每一步棋都是在棋盘内的,并且只能被放置在一个空的格子里; 2 . 一旦游戏中有一名玩家胜出的话,游戏将不能再继续; 3 . 一个玩家如果在同一行、同一列或者同一斜对角线上都放置了自己的棋子,那么他便获得胜利。

    • 两个结构

      • 玩家1在第x行下了几次, 玩家2在第x行下了几次 (7 * 2的结构)
      • 玩家1在第x列下了几次, 玩家2在第x列下了几次 (2 * 7的结构)
    • 对角线赢得情况只有这两条对角线

      • image.png
      • 玩家1在左对角线上下了几个, 玩家1在右对角线上下了几个,
      • 玩家2在左对角线上下了几个, 玩家2在右对角线上下了几个,
      • 四个变量足矣
    1. class TicTacToe {
    2. private int[][] rows;
    3. private int[][] cols;
    4. private int[] leftUp;
    5. private int[] rightUp;
    6. private boolean[][] matrix;
    7. private int N;
    8. public TicTacToe(int n) {
    9. rows = new int[n][3]; // 0列弃而不用
    10. cols = new int[n][3];
    11. leftUp = new int[3];
    12. rightUp = new int[3];
    13. matrix = new boolean[n][n];
    14. N = n;
    15. }
    16. public int move(int row, int col, int player) {
    17. if (matrix[row][col]) { // 这个位置已经有旗子了
    18. return 0;
    19. }
    20. matrix[row][col] = true;
    21. rows[row][player]++;
    22. cols[col][player]++;
    23. if (row == col) {
    24. leftUp[player]++;
    25. }
    26. if (row + col == N - 1) {
    27. rightUp[player]++;
    28. }
    29. if (rows[row][player] == N || cols[col][player] == N || leftUp[player] == N || rightUp[player] == N) {
    30. return player;
    31. }
    32. return 0;
    33. }
    34. }