为何字符'<'碰到边界'*'未转为'>'反而消失?
问题定位与修复
核心问题
处理左移车辆(<)的逻辑中缺少break语句,导致转向后的符号被后续分支覆盖为.,最终表现为车辆消失。
问题细节分析
- 右移车辆(
>)的逻辑里,成功移动后执行了break,跳出当前行的循环,不会进入后续的else分支修改当前位置。 - 左移车辆(
<)的逻辑中,无论是移动到空位还是碰到边界转向,都没有break,循环会继续执行到else分支,将map[i][j]强制设为.,直接清除了刚转向的>。
修复后的代码
void moveCar(int rows, int cols, char **map) { int i, j; for (i = 1; i < rows; i+=2) { for (j = 0; j < cols; j++) { if (map[i][j] == '>') { if (j < cols - 1) { if (map[i][j + 1] == '.') { map[i][j + 1] = '>'; map[i][j] = '.'; break; } else if (map[i][j + 1] == '*') { map[i][j] = '<'; break; // 补充break,避免后续循环干扰 } } } else if (map[i][j] == '<') { if (j > 0) { if (map[i][j - 1] == '.') { map[i][j - 1] = '<'; map[i][j] = '.'; break; // 添加break,跳出当前行循环 } else if (map[i][j - 1] == '*') { map[i][j] = '>'; break; // 添加break,避免进入else分支 } } } // 移除不必要的else分支:原逻辑会强制覆盖非车辆位置为.,可能破坏地图原有静态元素 } } }
额外优化说明
原代码中的else分支会将所有非车辆的位置强制设为.,这可能破坏地图上的其他静态元素(比如除*和车辆外的其他标记),建议直接移除该分支,只聚焦处理车辆的移动逻辑。
内容的提问来源于stack exchange,提问作者user21426307
相关产品推荐
相关产品推荐

