Python编写数独2D数组空单元格得分计算函数求助
解决方案
完整实现代码
def scoreArray(grid): results = [] for x in range(9): for y in range(9): if grid[x][y] != 0: continue # 计算行得分:当前行非0元素数量 row_score = sum(1 for num in grid[x] if num != 0) # 计算列得分:当前列非0元素数量 col_score = sum(1 for row in grid if row[y] != 0) # 计算3x3宫得分 start_row = (x // 3) * 3 start_col = (y // 3) * 3 box_score = 0 for i in range(start_row, start_row + 3): for j in range(start_col, start_col + 3): if grid[i][j] != 0: box_score += 1 # 总得分 total_score = row_score + col_score + box_score results.append((x, y, total_score)) return results # 测试代码 if __name__ == "__main__": # 你提供的测试棋盘 board = [ [7,8,0,4,0,0,1,2,0], [6,0,0,0,7,5,0,0,9], [0,0,0,6,0,1,0,7,8], [0,0,7,0,4,0,2,6,0], [0,0,1,0,5,0,9,3,0], [9,0,4,0,6,0,0,0,5], [0,7,0,3,0,0,0,1,2], [1,2,0,0,0,7,4,0,0], [0,4,9,2,0,6,0,0,7] ] res = scoreArray(board) for item in res: print(list(item))
逻辑说明
- 行得分计算:直接取当前行
grid[x],统计其中非0元素的数量即可,你原来的代码写反了行和列的索引,统计的其实是列的得分。 - 列得分计算:遍历所有行,取每行的第
y个元素,统计非0的数量。 - 3x3宫得分计算:先通过整数除法找到当前单元格所属宫的左上角坐标,行方向起始为
(x//3)*3,列方向起始为(y//3)*3,然后遍历这个3x3的区域,统计非0元素数量即可。
你举的X单元格例子(第二行第二列,对应数组索引x=1,y=1),传入对应棋盘调用函数就会得到(1,1,7)的正确结果。
内容的提问来源于stack exchange,提问作者gaming4 mining
相关产品推荐
相关产品推荐

