题目描述:判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
1-9
在每一行只能出现一次。1-9
在每一列只能出现一次。1-9
在每一个以粗实线分隔的 3x3
宫内只能出现一次。解题思路:
按顺序判断这三个条件即可,一旦判断为无效,直接返回False
具体方法:
在判断行内是否有效时,先将str转换为int,注意碰到 '.' 时不转
for i in range(9):
board1[i] = [int(x) for x in board1[i] if x != "."] #将字符串转为int,字符'.'将丢弃
这样就将每行的数字提取出来了。之后将列表转为集合,再比较集合与列表的长度,如果长度相同,则说明这一行不存在重复数字;如果长度不同,说明有重复数字,就可以返回False了
在判断列内是否有效时,需要先用zip函数转置一下,之后处理流程和行的处理流程相同
判断每个小的3*3的格子是否有效时,需要先将每个小格拼成一个列表,再去判断。
每次判断的方法都是一样的,区别是前期的处理,行不需处理,列需要转置,小格需要拼接。当所有的判断都通过时,返回True。
第一个版本写得很差,很多代码重复的地方可以写成函数,第二次写的时候改进一下就好。
# 0. 判断每行是否符合要求。
board1 = board.copy()
for i in range(9):
board1[i] = [int(x) for x in board1[i] if x != "."] #将字符串转为int,字符'.'将丢失
j = 0
while j<9 :
board1_set = set(board1[j])
if len(board1_set) ==len(board1[j]) :
j +=1
else:
return False
# 1. 判断每列是否符合要求
col = list(zip(board[0], board[1], board[2], board[3], board[4], board[5], board[6], board[7],board[8]))
for x in col:
x = list(x)
for i in range(9):
col[i] = [int(x) for x in col[i] if x != "."] #将字符串转为int,字符'.'将丢失
j = 0
while j<9 :
board1_set = set(col[j])
if len(board1_set) == len(col[j]):
j +=1
else:
return False
# 2. 判断每个九宫格是否符合要求
board3 = []
for i in range(0, 9, 3):
for j in range(0, 9, 3):
fx = board[i][j:j+3]+board[i+1][j:j+3]+board[i+2][j:j+3]
board3.append(fx) #每个九宫格是一个小列表
for i in range(9):
board3[i] = [int(x) for x in board3[i] if x != "."] #将字符串转为int,字符'.'将丢失
j = 0
while j<9 :
board1_set = set(board3[j])
if len(board1_set) == len(board3[j]):
j +=1
else:
return False
return True