LeetCode Top Interview Questions 348. Design Tic-Tac-Toe (Java版; Medium)

welcome to my blog

LeetCode Top Interview Questions 348. Design Tic-Tac-Toe (Java版; Medium)

题目描述


You may assume the following rules:

A move is guaranteed to be valid and is placed on an empty block.
Once a winning condition is reached, no more moves is allowed.
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?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-tic-tac-toe
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Design a Tic-tac-toe game that is played between two players on a n x n grid.

You may assume the following rules:

A move is guaranteed to be valid and is placed on an empty block.
Once a winning condition is reached, no more moves is allowed.
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?

第一次做; 空间复杂度O(N); 核心: 设棋盘边长为n, 创建长为n的rows数组和cols数组, rows[i]表示第i行的情况, cols[i]表示第i列的情况, diag表示正对角线的情况, diag2表示反对角线的情况; 玩家1移动时,对应的行和列都加1, 如果在对角线(反对角线)上的话,对角线(反对角线)加1; 玩家2移动时, 对应的变量减1; 当rows[i]==n时, 说明玩家1获胜, 当rows[i]==-n时, 说明玩家2获胜; cols, diag, diag2同理; 细节: 反对角线的坐标满足row-0 = n-1-col -> col = n-1-row

class TicTacToe {
    private int[] rows;
    private int[] cols;
    private int diag; //记录正对角线的情况
    private int diag2; //记录逆对角线的情况
    
    /** Initialize your data structure here. */
    public TicTacToe(int n) {
        rows = new int[n];
        cols = new int[n];
    }
    
    /** Player {player} makes a move at ({row}, {col}).
        @param row The row of the board.
        @param col The column of the board.
        @param player The player, can be either 1 or 2.
        @return The current winning condition, can be either:
                0: No one wins.
                1: Player 1 wins.
                2: Player 2 wins. */
    public int move(int row, int col, int player) {
        //玩家1用1表示, 玩家2用-1表示
        int digit = player == 1 ? 1 : -1;
        //棋盘边长
        int n = rows.length;
        //胜利条件
        int win = player==1 ? n : -n;
        
        //判断行的情况
        rows[row] += digit;
        if(rows[row]==win)
            return player;
        
        //判断列的情况下
        cols[col] += digit;
        if(cols[col]==win)
            return player;
        
        //判断对角线的情况
        if(row==col){
            diag += digit;
            if(diag==win)
                return player;
        }
        
        //判断反对角线的情况
        if(col==n-1-row){
            diag2 += digit;
            if(diag2==win)
                return player;
        }
        return 0;
    }
}

/**
 * Your TicTacToe object will be instantiated and called as such:
 * TicTacToe obj = new TicTacToe(n);
 * int param_1 = obj.move(row,col,player);
 */

第一次做; 最直观的做法: 每次移动后, 检查行、列、正对角线、反对角线; 空间复杂度O(N^2)

class TicTacToe {

    private int[][] arr;
    /** Initialize your data structure here. */
    public TicTacToe(int n) {
        arr = new int[n][n];
    }
    
    /** Player {player} makes a move at ({row}, {col}).
        @param row The row of the board.
        @param col The column of the board.
        @param player The player, can be either 1 or 2.
        @return The current winning condition, can be either:
                0: No one wins.
                1: Player 1 wins.
                2: Player 2 wins. */
    public int move(int row, int col, int player) {
        arr[row][col] = player;
        int n = arr.length;
        boolean flag = true;
        for(int j=0; j<n; j++)
            flag = flag && (arr[row][j]==player);
        if(flag)
            return player;
        flag = true;
        for(int i=0; i<n; i++)
            flag = flag && (arr[i][col]==player);
        if(flag)
            return player;
        flag = true;
        //正对角线
        for(int i=0; i<n; i++)
            flag = flag&&(arr[i][i]==player); 
        if(flag)
            return player;
        flag = true;
        //反对角线
        for(int i=0; i<n; i++)
            //i-0 = n-1-x -> x = n-1-i
            flag = flag && (arr[i][n-1-i]==player);
        return flag==true? player : 0;
    }
}

/**
 * Your TicTacToe object will be instantiated and called as such:
 * TicTacToe obj = new TicTacToe(n);
 * int param_1 = obj.move(row,col,player);
 */
发布了580 篇原创文章 · 获赞 130 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/littlehaes/article/details/104217114
今日推荐