Python数独打印程序故障:网格边框输出不符合预期如何修复
数独棋盘带网格打印问题
问题说明
需要将嵌套列表格式存储的数独棋盘添加网格线与边框后打印到控制台,当前编写的代码输出结果不符合预期,无法定位问题原因。
现有资源
测试用例
提供了4x4、9x9、16x16三种尺寸的数独测试棋盘:
small = [[0, 0, 1, 0], [4, 0, 0, 0], [0, 0, 0, 2], [0, 3, 0, 0]] big = [[0, 0, 0, 0, 0, 0, 0, 0, 0], [4, 0, 0, 7, 8, 9, 0, 0, 0], [7, 8, 0, 0, 0, 0, 0, 5, 6], [0, 2, 0, 3, 6, 0, 8, 0, 0], [0, 0, 5, 0, 0, 7, 0, 1, 0], [8, 0, 0, 2, 0, 0, 0, 0, 5], [0, 0, 1, 6, 4, 0, 9, 7, 0], [0, 0, 0, 9, 0, 0, 0, 0, 0], [0, 0, 0, 0, 3, 0, 0, 0, 2]] giant = [[0, 5, 0, 0, 0, 4, 0, 8, 0, 6, 0, 0, 0, 0, 9, 16], [1, 0, 0, 0, 0, 0, 0, 13, 4, 0, 0, 7, 15, 0, 8, 0], [13, 0, 0, 0, 0, 7, 3, 0, 0, 0, 0, 9, 5, 10, 0, 0], [0, 11, 12, 15, 10, 0, 0, 0, 0, 0, 5, 0, 3, 4, 0, 13], [15, 0, 1, 3, 0, 0, 7, 2, 0, 0, 0, 0, 0, 5, 0, 0], [0, 0, 0, 12, 0, 3, 0, 5, 0, 11, 0, 14, 0, 0, 0, 9], [4, 7, 0, 0, 0, 0, 0, 0, 12, 0, 15, 16, 0, 0, 0, 0], [0, 0, 0, 0, 14, 0, 15, 0, 6, 9, 0, 0, 0, 0, 12, 0], [3, 0, 15, 4, 0, 13, 14, 0, 0, 0, 0, 1, 0, 0, 7, 8], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0], [11, 0, 16, 10, 0, 0, 0, 0, 0, 7, 0, 0, 0, 3, 5, 0], [0, 0, 13, 0, 0, 0, 0, 0, 14, 0, 15, 16, 0, 9, 0, 1], [9, 0, 2, 0, 0, 14, 0, 4, 8, 0, 0, 0, 0, 0, 0, 0], [0, 14, 0, 0, 0, 0, 0, 10, 9, 0, 3, 0, 0, 0, 1, 7], [8, 0, 0, 0, 16, 0, 0, 1, 2, 14, 11, 4, 0, 0, 0, 3], [0, 0, 0, 1, 0, 0, 5, 0, 0, 16, 0, 6, 0, 12, 0, 0]]
现有打印逻辑代码
import math def print_board(board): board_size = len(board) l = int(board_size + math.sqrt(board_size) + 1) section = int(math.sqrt(board_size)) border = 0 i_index = 0 for i in range(0, l): if (i == border): print('-' * l) border = border + section + 1 else: inner_border = 0 j_index = 0 for j in range(0, l): if (j == inner_border): print('|', end='') inner_border = inner_border + section + 1 else: if (board[i_index][j_index] == 0): print(' ', end='') else: if (board[i_index][j_index] < 10): print(board[i_index][j_index], end='') if (board[i_index][j_index] == 10): print('A', end='') if (board[i_index][j_index] == 11): print('B', end='') if (board[i_index][j_index] == 12): print('C', end='') if (board[i_index][j_index] == 13): print('D', end='') if (board[i_index][j_index] == 14): print('E', end='') if (board[i_index][j_index] == 15): print('F', end='') if (board[i_index][j_index] == 16): print('G', end='') j_index = j_index + 1 i_index = i_index + 1 print(print_board(small)) print(print_board(big)) print(print_board(giant))
功能要求
- 输入为4x4、9x9或16x16的嵌套列表格式数独棋盘
- 控制台输出格式化后的棋盘,列内容对齐
- 子网格边界清晰可辨
预期输出效果
------- | |1 | |4 | | ------- | | 2| | 3| | ------- >>> print_board(big) ------------- | | | | |4 |789| | |78 | | 56| ------------- | 2 |36 |8 | | 5| 7| 1 | |8 |2 | 5| ------------- | 1|64 |97 | | |9 | | | | 3 | 2| ------------- >>> print_board(giant) --------------------- | 5 | 4 8| 6 | 9G| |1 | D|4 7|F 8 | |D | 73 | 9|5A | | BCF|A | 5 |34 D| --------------------- |F 13| 72| | 5 | | C| 3 5| B E| 9| |47 | |C FG| | | |E F |69 | C | --------------------- |3 F4| DE | 1| 78| | | | 9A| | |B GA| | 7 | 35 | | D | |E GF| 9 1| --------------------- |9 2 | E 4|8 | | | E | A|9 3 | 17| |8 |G 1|2EB4| 3| | 1| 5 | G 6| C | ---------------------
问题原因与修复方案
存在的问题
- 每行内容打印完成后没有添加换行,导致所有行内容连在一起
- 调用
print_board时额外加了print()包装,print_board没有返回值会额外打印None - 数值判断用了多分支独立
if,存在逻辑冗余
修正后的代码
import math def print_board(board): board_size = len(board) l = int(board_size + math.sqrt(board_size) + 1) section = int(math.sqrt(board_size)) border = 0 i_index = 0 for i in range(0, l): if i == border: print('-' * l) border = border + section + 1 else: inner_border = 0 j_index = 0 for j in range(0, l): if j == inner_border: print('|', end='') inner_border = inner_border + section + 1 else: val = board[i_index][j_index] if val == 0: print(' ', end='') elif val < 10: print(val, end='') elif val == 10: print('A', end='') elif val == 11: print('B', end='') elif val == 12: print('C', end='') elif val == 13: print('D', end='') elif val == 14: print('E', end='') elif val == 15: print('F', end='') elif val == 16: print('G', end='') j_index = j_index + 1 # 每行结束后换行 print() i_index = i_index + 1 # 直接调用函数即可,不需要额外print包装 print_board(small) print_board(big) print_board(giant)
内容的提问来源于stack exchange,提问作者user16812303
相关产品推荐
相关产品推荐

