• Design Tic-Tac-Toe 解答


    Question

    Design a Tic-tac-toe game that is played between two players on a n x n grid.

    You may assume the following rules:

    1. A move is guaranteed to be valid and is placed on an empty block.
    2. Once a winning condition is reached, no more moves is allowed.
    3. A player who succeeds in placing n of their marks in a horizontal, vertical, or diagonal row wins the game. 

    Example:

    Given n = 3, assume that player 1 is "X" and player 2 is "O" in the board.
    
    TicTacToe toe = new TicTacToe(3);
    
    toe.move(0, 0, 1); -> Returns 0 (no one wins)
    |X| | |
    | | | |    // Player 1 makes a move at (0, 0).
    | | | |
    
    toe.move(0, 2, 2); -> Returns 0 (no one wins)
    |X| |O|
    | | | |    // Player 2 makes a move at (0, 2).
    | | | |
    
    toe.move(2, 2, 1); -> Returns 0 (no one wins)
    |X| |O|
    | | | |    // Player 1 makes a move at (2, 2).
    | | |X|
    
    toe.move(1, 1, 2); -> Returns 0 (no one wins)
    |X| |O|
    | |O| |    // Player 2 makes a move at (1, 1).
    | | |X|
    
    toe.move(2, 0, 1); -> Returns 0 (no one wins)
    |X| |O|
    | |O| |    // Player 1 makes a move at (2, 0).
    |X| |X|
    
    toe.move(1, 0, 2); -> Returns 0 (no one wins)
    |X| |O|
    |O|O| |    // Player 2 makes a move at (1, 0).
    |X| |X|
    
    toe.move(2, 1, 1); -> Returns 1 (player 1 wins)
    |X| |O|
    |O|O| |    // Player 1 makes a move at (2, 1).
    |X|X|X|
    

    Follow up:
    Could you do better than O(n2) per move() operation?

    Hint:

      1. Could you trade extra space such that move() operation can be done in O(1)?
      2. You need two arrays: int rows[n], int cols[n], plus two variables: diagonal, anti_diagonal.

    Answer

    对于move操作,简单粗暴的方法是遍历整个二维数组,对每一行每一列以及对角线检查。时间,空间复杂度均为O(n^2)

    我们可以单独考虑行,列,对角。

    对于一行row[i],如果这一行中有棋手1下过,则+1。如果有棋手2下过,则-1。所以如果这一行全为棋手1下的,row[i]=n。棋手1获胜。

    Similar case for col and diagonal, anti diagonal。

    Time complexity O(1) Space complexity O(n)

     1 public class TicTacToe {
     2 
     3     private int[] row;
     4     private int[] col;
     5     private int diagonal;
     6     private int anti_diagonal;
     7     private int size;
     8     /** Initialize your data structure here. */
     9     public TicTacToe(int n) {
    10         size = n;
    11         row = new int[n];
    12         col = new int[n];
    13         Arrays.fill(row, 0);
    14         Arrays.fill(col, 0);
    15         diagonal = 0;
    16         anti_diagonal = 0;
    17     }
    18     
    19     /** Player {player} makes a move at ({row}, {col}).
    20         @param row The row of the board.
    21         @param col The column of the board.
    22         @param player The player, can be either 1 or 2.
    23         @return The current winning condition, can be either:
    24                 0: No one wins.
    25                 1: Player 1 wins.
    26                 2: Player 2 wins. */
    27     public int move(int row, int col, int player) {
    28         int change = player == 1 ? 1 : -1;
    29         this.row[row] += change;
    30         this.col[col] += change;
    31         if (row == col) {
    32             diagonal += change;
    33         }
    34         if (row == (size - col - 1)) {
    35             anti_diagonal += change;
    36         }
    37         if (this.row[row] == size || this.col[col] == size || diagonal == size || anti_diagonal == size) {
    38             return 1;
    39         }
    40         if (this.row[row] == -size || this.col[col] == -size || diagonal == -size || anti_diagonal == -size) {
    41             return 2;
    42         }
    43         return 0;
    44     }
    45 }
    46 
    47 /**
    48  * Your TicTacToe object will be instantiated and called as such:
    49  * TicTacToe obj = new TicTacToe(n);
    50  * int param_1 = obj.move(row,col,player);
    51  */
  • 相关阅读:
    JavaScript Design Patterns: Mediator
    Javascript模块化编程系列一: 模块化的驱动
    【329】word 替换文本高级用法
    【327】Python 中 PIL 实现图像缩放
    【326】PIL 截图及图片识别
    【325】python**:selenium
    Android iOS Dribbble风格边栏菜单实现
    Prof UIS相关
    浅谈工作中的几点小心得
    zookeeper与activemq最新存储replicatedLevelDB整合
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/6022504.html
Copyright © 2020-2023  润新知