ACM2563题代码问题:修改二维数组元素时全列表同步变更
问题根源及解决方案
核心错误:二维数组的引用复用
你代码里创建white_board的方式导致所有行指向同一个列表对象:
for x in range(99): white_board.append(white_board[0]) # 所有行都是同一个列表的引用
Python中可变对象(比如列表)的赋值/append操作传递的是内存引用,不是副本。所以你修改任意一行的元素,所有行都会同步变化——因为它们本质上是同一个列表。
正确的二维数组创建方式
用列表推导式生成独立的行,每一行都是全新的列表:
white_board = [[0]*100 for _ in range(100)]
这样white_board的每一行都是独立对象,修改某一行不会影响其他行。
修正后的完整代码
# 创建100x100的独立二维数组 white_board = [[0]*100 for _ in range(100)] n = int(input()) pos_list = [] for _ in range(n): a, b = map(int, input().split()) pos_list.append((a, b)) for x, y in pos_list: start_y = 100 - y for dy in range(10): current_y = start_y - dy start_x = x - 1 for dx in range(10): current_x = start_x + dx white_board[current_y][current_x] = 1 # 统计涂色总面积 count = sum(row.count(1) for row in white_board) print(count)
补充说明
- 列表推导式
[[0]*100 for _ in range(100)]中,外层循环每次都会生成新的一行,彻底避免了引用复用问题。 - 坐标转换逻辑符合题目要求:题目中的
(x,y)是左下角坐标,数组行号越大越靠下,用100 - y作为起始行,循环10次覆盖10行;列号直接从x-1开始,循环10次覆盖10列,刚好对应10x10的涂色区域。
内容的提问来源于stack exchange,提问作者iwanttosleep
相关产品推荐
相关产品推荐

