Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Leetcode_1275_Find Winner on a Tic Tac Toe Game #31

Open
lihe opened this issue Dec 6, 2019 · 0 comments
Open

Leetcode_1275_Find Winner on a Tic Tac Toe Game #31

lihe opened this issue Dec 6, 2019 · 0 comments
Labels

Comments

@lihe
Copy link
Owner

lihe commented Dec 6, 2019

Find Winner on a Tic Tac Toe Game

Tic-tac-toe is played by two players A and B on a 3 x 3 grid.

Here are the rules of Tic-Tac-Toe:

  • Players take turns placing characters into empty squares (" ").
  • The first player A always places "X" characters, while the second player B always places "O" characters.
  • "X" and "O" characters are always placed into empty squares, never on filled ones.
  • The game ends when there are 3 of the same (non-empty) character filling any row, column, or diagonal.
  • The game also ends if all squares are non-empty.
  • No more moves can be played if the game is over.

Given an array moves where each element is another array of size 2 corresponding to the row and column of the grid where they mark their respective character in the order in which A and B play.

Return the winner of the game if it exists (A or B), in case the game ends in a draw return "Draw", if there are still movements to play return "Pending".

You can assume that moves is valid (It follows the rules of Tic-Tac-Toe), the grid is initially empty and A will play first.

Example 1:

Input: moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
Output: "A"
Explanation: "A" wins, he always plays first.
"X  "    "X  "    "X  "    "X  "    "X  "
"   " -> "   " -> " X " -> " X " -> " X "
"   "    "O  "    "O  "    "OO "    "OOX"

Example 2:

Input: moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]
Output: "B"
Explanation: "B" wins.
"X  "    "X  "    "XX "    "XXO"    "XXO"    "XXO"
"   " -> " O " -> " O " -> " O " -> "XO " -> "XO " 
"   "    "   "    "   "    "   "    "   "    "O  "

Example 3:

Input: moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]]
Output: "Draw"
Explanation: The game ends in a draw since there are no moves to make.
"XXO"
"OOX"
"XOX"

Example 4:

Input: moves = [[0,0],[1,1]]
Output: "Pending"
Explanation: The game has not finished yet.
"X "
" O "
" "

Constraints:

  • 1 <= moves.length <= 9
  • moves[i].length == 2
  • 0 <= moves[i][j] <= 2
  • There are no repeated elements on moves.
  • moves follow the rules of tic tac toe.

算法思路:

  1. 一共只有九个格子,并且赢面是固定的,可以使用一个9位二进制代表最后棋盘的结果,规定:井字形棋盘的[i,j]代表二进制数的第3*i + j位,没走一步棋等价于与对应的位进行异或运算。
  2. 将一方的数字与能获胜的数字k进行与运算,如果结果为k,则此方获胜,若双方都未获胜则:
    • 若总步数为9步,则平局;
    • 否则,未完成;
  3. 赢面数字只有8种分别是7, 56, 448, 73, 146, 292, 273, 84
public String tictactoe(int[][] moves) {
    int a = 0, b = 0, len = moves.length;

    int[] ac =  {7, 56, 448, 73, 146, 292, 273, 84};
    for(int i = 0; i < len; i++){
        if((i & 1) == 1){
            b ^= 1 << (3 * moves[i][0] + moves[i][1]);
        }else{
            a ^= 1 << (3 * moves[i][0] + moves[i][1]);
        }
    }

    for(int i : ac){
        if((a & i) == i){
            return "A";
        }
        if((b & i) == i){
            return "B";
        }
    }
    return len == 9 ? "Draw" : "Pending";
}
@lihe lihe added the Leetcode label Dec 6, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant