CodeUp 6098递归路径标记问题:代码逻辑错误求助
CodeUp 6098题路径标记问题修复求助
题目规则
- 起点为坐标(1,1)
- 仅能向值为0的格子移动,优先向右(坐标变化:
(x, y+1)),其次向下(坐标变化:(x+1, y)) - 遇到值为2的格子或无法移动时停止,走过的路径标记为9
问题说明
我在实现时,代码输出结果不符合预期:所有0都被改为9,而不是仅标记正确路径。调试发现(6,6)处的break未生效,向下移动的判断分支未正常工作,代码未按预期停止。
初始网格
1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 2 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
期望输出
1 1 1 1 1 1 1 1 1 1 1 9 9 1 0 0 0 0 0 1 1 0 9 1 1 1 0 0 0 1 1 0 9 9 9 9 9 1 0 1 1 0 0 0 0 0 9 1 0 1 1 0 0 0 0 1 9 1 0 1 1 0 0 0 0 1 9 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
错误输出
1 1 1 1 1 1 1 1 1 1 1 9 9 1 9 9 9 9 9 1 1 0 9 1 1 1 9 9 9 1 1 9 9 9 9 9 9 1 9 1 1 9 9 9 9 9 9 1 9 1 1 9 9 9 9 1 9 1 9 1 1 9 9 9 9 1 9 1 9 1 1 9 9 9 9 1 9 9 9 1 1 9 9 9 9 9 9 9 9 1 1 1 1 1 1 1 1 1 1 1
我的代码
grid = [] for i in range(10): grid.append([]) for j in range(10): grid[i].append(0) for i in range(10): grid[i] = list(map(int, input().split())) p_x, p_y = (1,1) grid[p_x][p_y] = 9 def move(p_x, p_y): for x in range(p_x,9): for y in range(p_y,9): print(x,y) if grid[x][y + 1] == 0: grid[x][y + 1] = 9 move(x, y + 1) elif grid[x][y + 1] == 2: grid[x][y + 1] = 9 break elif grid[x + 1][y] == 0: grid[x + 1][y] = 9 move(x + 1, y) elif grid[x + 1][y] == 2: grid[x + 1][y] = 9 break else: break move(p_x, p_y)
问题分析与修复
原代码的核心错误是使用了嵌套for循环+递归的组合:for循环会遍历所有后续的x、y坐标,递归又会重复触发循环,导致所有0都被标记为9;同时break只能跳出当前的内层循环,无法终止整个移动流程。
正确的思路是单步移动循环:从当前位置出发,每次只判断向右/向下的可行性,移动到下一个位置后继续判断,直到触发停止条件。
修复后的代码:
# 初始化网格 grid = [] for _ in range(10): row = list(map(int, input().split())) grid.append(row) # 起点坐标 x, y = 1, 1 grid[x][y] = 9 while True: # 优先判断向右移动 if grid[x][y+1] == 0: y += 1 grid[x][y] = 9 elif grid[x][y+1] == 2: # 遇到终点,标记后停止 y += 1 grid[x][y] = 9 break # 向右不可行,判断向下移动 elif grid[x+1][y] == 0: x += 1 grid[x][y] = 9 elif grid[x+1][y] == 2: x += 1 grid[x][y] = 9 break # 无法移动,停止 else: break # 打印结果 for row in grid: print(' '.join(map(str, row)))
修复说明
- 去掉冗余的初始化代码,直接读取输入构建网格
- 使用
while True循环实现单步移动,每次只处理当前位置的下一个方向 - 每移动一次就更新当前坐标,直到遇到2或无法移动时终止循环
- 最后统一打印网格结果
内容的提问来源于stack exchange,提问作者유한정
相关产品推荐
相关产品推荐

