Python 棋盘翻转问题:高效实现及时间复杂度分析
Python 棋盘翻转问题:高效实现及时间复杂度分析
问题描述: 小蓝拥有 n × n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。
思路: 模拟每次操作,用二维数组存储棋盘上每个位置的颜色,最后输出即可。
代码实现:
n, m = map(int, input().split())
board = [[0]*n for _ in range(n)] # 初始化棋盘
for i in range(m):
x1, y1, x2, y2 = map(int, input().split())
for x in range(x1-1, x2):
for y in range(y1-1, y2):
board[x][y] ^= 1 # 取反操作
for i in range(n):
for j in range(n):
print(board[i][j], end=' ')
print()
时间复杂度: $O(n^2m)$
代码解释:
- 初始化棋盘:
board = [[0]*n for _ in range(n)]使用列表推导创建一个 n×n 的二维数组,并将其所有元素初始化为 0,表示白色棋子。 - 循环操作:
for i in range(m)循环遍历 m 次操作。 - 获取操作范围:
x1, y1, x2, y2 = map(int, input().split())从输入中读取每次操作的左上角坐标 (x1, y1) 和右下角坐标 (x2, y2)。 - 翻转棋子:
for x in range(x1-1, x2):和for y in range(y1-1, y2):循环遍历操作范围内所有棋子,board[x][y] ^= 1使用异或运算^将棋子颜色取反。 - 输出棋盘:
for i in range(n):和for j in range(n):循环遍历棋盘,输出每个位置的棋子颜色。
优化建议:
- 使用 NumPy: 可以使用 NumPy 库来创建和操作二维数组,提高代码效率。
- 优化遍历: 可以使用 NumPy 的数组切片功能,避免使用嵌套循环,进一步提高代码效率。
- 优化取反操作: 可以使用 NumPy 的
logical_xor()函数,更高效地实现棋子颜色取反。
总结: 本文介绍了用 Python 代码解决棋盘翻转问题的思路和实现方法。通过模拟每次操作,利用二维数组存储棋盘状态,并运用异或运算实现棋子颜色取反。同时,详细分析了代码的时间复杂度,帮助读者理解算法效率。可以根据实际情况进行优化,提高代码效率。
原文地址: http://www.cveoy.top/t/topic/jCip 著作权归作者所有。请勿转载和采集!