LeetCode #1275. Find Winner on a Tic Tac Toe Game

题目

1275. Find Winner on a Tic Tac Toe Game


解题方法

初始化一个字典dic,用来记录某个玩家走的位置,并用两个计数器totalmoves和movecount记录总步数和当前玩家步数,先遍历数组中偶数下标位置(0、2、4...),如果当前步数达到3步以上,则开始判断是否获胜。如果A没有获胜,重置字典和movecount,再判断B,如果B也没有获胜,则判断总步数是否达到上限9,如果没有就是pending,有就是draw。

判断获胜的方法是判断当前列或行,或两条对角线上的点是否都在字典中,满足一个就获胜了。
时间复杂度:O(n)
空间复杂度:O(n)


代码

class Solution:
    def tictactoe(self, moves: List[List[int]]) -> str:
        dic = {}
        totalmoves = 0
        movecount = 0
        for move in range(0, len(moves), 2):
            dic[tuple(moves[move])] = "A"
            movecount += 1
            if movecount > 2:
                i, j = moves[move][0], moves[move][1]
                if ((i+1)%3, j) in dic and ((i+2)%3, j) in dic \
                or (i, (j+1)%3) in dic and (i, (j+2)%3) in dic \
                or (0, 0) in dic and (1, 1) in dic and (2, 2) in dic \
                or (0, 2) in dic and (1, 1) in dic and (2, 0) in dic:
                    return dic[tuple(moves[move])]
        
        dic.clear()
        totalmoves += movecount
        movecount = 0
        
        for move in range(1, len(moves), 2):
            dic[tuple(moves[move])] = "B"
            movecount += 1
            if movecount > 2:
                i, j = moves[move][0], moves[move][1]
                if ((i+1)%3, j) in dic and ((i+2)%3, j) in dic \
                or (i, (j+1)%3) in dic and (i, (j+2)%3) in dic \
                or (0, 0) in dic and (1, 1) in dic and (2, 2) in dic \
                or (0, 2) in dic and (1, 1) in dic and (2, 0) in dic:
                    return dic[tuple(moves[move])]
        
        totalmoves += movecount
        if totalmoves == 9:
            return "Draw"
        else:
            return "Pending"
posted @ 2020-11-25 11:12  老鼠司令  阅读(119)  评论(0)    收藏  举报