iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1
自我挑戰組

每日LeetCode解題紀錄系列 第 20

LeetCode解題 Day20

  • 分享至 

  • xImage
  •  

1275. Find Winner on a Tic Tac Toe Game

https://leetcode.com/problems/find-winner-on-a-tic-tac-toe-game/


題目解釋

請找出圈圈叉叉的贏家,題目會給你一個陣列moves,代表兩個玩家遊玩畫下記號的過程,請回傳現在的遊戲狀況,如果先手的玩家勝利就回傳'A'、後手的玩家勝利就回傳'B'、平手就回傳'Draw'、還在進行中就回傳'Pending'。

example

https://i.imgur.com/CJ71VFd.png


解法

圈圈叉叉的勝利條件是3個符號的連線,而連出來的線有8種: 3個行方向的線、3個列方向的線、1個對角線、1個反對角線,所以我們只要觀察這6條線有沒有達到勝利條件就好

再來是如何標記是哪位選手的記號,我們在九宮格標記1代表先手玩家、以-1代表後手玩家,這樣出現勝利條件就是任一條線的積為3或-3

程式碼

class Solution:
    def tictactoe(self, moves: List[List[int]]) -> str:
        
        rows, cols = [0] * 3, [0] * 3
        diag1 ,diag2 = 0, 0
        
        player = 1
        for i, j in moves:
            
            rows[i] += player
            cols[j] += player
            
            if i == j:
                if i == 1:
                    diag1 += player
                    diag2 += player
                else:
                    diag1 += player
            
            if abs(i-j) == 2:
                diag2 += player
            
            if rows[i] == 3 or cols[j] == 3 or diag1 == 3 or diag2 == 3:
                return 'A'
            if rows[i] == -3 or cols[j] == -3 or diag1 == -3 or diag2 == -3:
                return 'B'
            
            player *= -1
        
        return 'Pending' if len(moves) < 9 else 'Draw'

閒聊

今天是簡單難度的題目,寫完之後就可以自己做個小遊戲了


上一篇
LeetCode解題 Day19
下一篇
LeetCode解題 Day21
系列文
每日LeetCode解題紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言