问题描述
用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true。
该游戏板是一个 3 x 3 数组,由字符 " ","X" 和 "O" 组成。字符 " " 代表一个空位。
以下是井字游戏的规则:
玩家轮流将字符放入空位(" ")中。
第一个玩家总是放字符 “X”,且第二个玩家总是放字符 “O”。
“X” 和 “O” 只允许放置在空位中,不允许对已放有字符的位置进行填充。
当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
当所有位置非空时,也算为游戏结束。
如果游戏结束,玩家不允许再放置字符。
例子
思路:
1.统计“X”和“O”的个数,“X“的个数大于”O“的个数,且不超过1
- 3*3的列表,总共8种情况,列举出来。
方法介绍
map(函数,参数)
a=map(lambda x,y:x+y,[1,2],[3,4])
print(list(a))
#out
[4,6]
zip()打包 和 zip(* ) 解压
zip([1,2],[3,4])
#out
[(1,3),(2,4)]
zip(*[(1,3),(2,4)])
#out
[(1,2),(3,4)]
实现
class Solution:
def validTicTacToe(self, board: List[str]) -> bool:
xNum = sum([ sum([x == 'X' for x in line]) for line in board])
oNum = sum([ sum([x == 'O' for x in line]) for line in board])
if (xNum != oNum) and (xNum - oNum != 1):
return False
a= [(r[i],r[2-i]) for i,r in enumerate(board) ]
print(a)
cols = map(''.join, zip(*board))#map(函数,参数))以此执行函数,zip()打包函数
print(list(cols))
diag = map(''.join, zip(*[(r[i],r[2-i]) for i,r in enumerate(board) ])) #解压元组
print(list(diag))
lines = board + list(cols) + list(diag)
oWin = True if 'OOO' in lines else False
xWin = True if 'XXX' in lines else False
if oWin and xWin:
return False
if oWin and (xNum != oNum):
return False
if xWin and (xNum - oNum != 1):
return False
return True
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state