LeetCode简单题之找出井字棋的获胜者
題目
A 和 B 在一個 3 x 3 的網格上玩井字棋。
井字棋游戲的規則如下:
玩家輪流將棋子放在空方格 (" ") 上。
第一個玩家 A 總是用 “X” 作為棋子,而第二個玩家 B 總是用 “O” 作為棋子。
“X” 和 “O” 只能放在空方格中,而不能放在已經被占用的方格上。
只要有 3 個相同的(非空)棋子排成一條直線(行、列、對角線)時,游戲結束。
如果所有方塊都放滿棋子(不為空),游戲也會結束。
游戲結束后,棋子無法再進行任何移動。
給你一個數組 moves,其中每個元素是大小為 2 的另一個數組(元素分別對應網格的行和列),它按照 A 和 B 的行動順序(先 A 后 B)記錄了兩人各自的棋子位置。
如果游戲存在獲勝者(A 或 B),就返回該游戲的獲勝者;如果游戲以平局結束,則返回 “Draw”;如果仍會有行動(游戲未結束),則返回 “Pending”。
你可以假設 moves 都 有效(遵循井字棋規則),網格最初是空的,A 將先行動。
示例 1:
輸入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
輸出:“A”
解釋:“A” 獲勝,他總是先走。
"X " "X " "X " "X " "X "
" " -> " " -> " X " -> " X " -> " X "
" " "O " "O " "OO " “OOX”
示例 2:
輸入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]
輸出:“B”
解釋:“B” 獲勝。
"X " "X " "XX " “XXO” “XXO” “XXO”
" " -> " O " -> " O " -> " O " -> "XO " -> "XO "
" " " " " " " " " " "O "
示例 3:
輸入:moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]]
輸出:“Draw”
輸出:由于沒有辦法再行動,游戲以平局結束。
“XXO”
“OOX”
“XOX”
示例 4:
輸入:moves = [[0,0],[1,1]]
輸出:“Pending”
解釋:游戲還沒有結束。
"X "
" O "
" "
提示:
1 <= moves.length <= 9
moves[i].length == 2
0 <= moves[i][j] <= 2
moves 里沒有重復的元素。
moves 遵循井字棋的規則。
來源:力扣(LeetCode)
解題思路
??這是一道非常直接的題,首先明確規則,只要三點成一線即可;moves中存儲的A和B的操作,我們把里面AB的操作分開來單獨檢驗它們是否能三點一線就好了,當然為了防止函數調用出錯,我們需要將各種情況分類。
class Solution:def tictactoe(self, moves: List[List[int]]) -> str:if len(moves)<3:return 'Pending'A=moves[::2] #偶數下標均為A的操作B=moves[1::2] #奇數下標均為B的操作def k(x,y): #計算斜率(棋盤和笛卡爾坐標系略有不同,按同樣的操作處理不影響結果)try:return (y[1]-x[1])/(y[0]-x[0]) #正常情況except:return float('inf') #斜率為tan90時的情況if len(A)<3:if len(B)>2:for x,y,z in itertools.combinations(B,3):if k(x,y)==k(x,z): #如果兩個符合三點共線條件即勝出return 'B'else:return 'Pending'else:if len(B)>2:for x,y,z in itertools.combinations(A,3):if k(x,y)==k(x,z):return 'A'for x,y,z in itertools.combinations(B,3):if k(x,y)==k(x,z):return 'B'else:for x,y,z in itertools.combinations(A,3):if k(x,y)==k(x,z):return 'A'return 'Pending'return 'Draw' if len(moves)==9 else 'Pending'
??當然可以利用向量外積來判斷三點是否同線。
class Solution:def tictactoe(self, moves: List[List[int]]) -> str:if len(moves)<3:return 'Pending'A=moves[::2]B=moves[1::2]if len(A)<3:if len(B)>2:for x,y,z in itertools.combinations(B,3):if (y[1]-x[1])*(z[0]-x[0])==(y[0]-x[0])*(z[1]-x[1]):return 'B'if (y[1]-x[1])*(z[0]-x[0])==(y[0]-x[0])*(z[1]-x[1]):return 'B'else:return 'Pending'else:if len(B)>2:for x,y,z in itertools.combinations(A,3):if (y[1]-x[1])*(z[0]-x[0])==(y[0]-x[0])*(z[1]-x[1]):return 'A'for x,y,z in itertools.combinations(B,3):if (y[1]-x[1])*(z[0]-x[0])==(y[0]-x[0])*(z[1]-x[1]):return 'B'else:for x,y,z in itertools.combinations(A,3):if (y[1]-x[1])*(z[0]-x[0])==(y[0]-x[0])*(z[1]-x[1]):return 'A'return 'Pending'return 'Draw' if len(moves)==9 else 'Pending'
總結
以上是生活随笔為你收集整理的LeetCode简单题之找出井字棋的获胜者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode简单题之山羊拉丁文
- 下一篇: LeetCode简单题之数组的相对排序