二维8方向最短路径C语言代码优化咨询
优化8方向最短路径移动的C实现
问题回顾
在二维空间中,一个物体位于坐标(Fx/Fy),可向8个相邻方向(东E、东南SE、南S、西南SW、西W、西北NW、北N、东北NE)移动一步。该物体需以最快速度到达目标点(Zx/Zy)。要求先读取物体和目标点的坐标,然后沿最短路径移动,输出每一步的坐标,最后输出所需的总步数。
原代码存在全局变量耦合度高、逻辑拆分冗余、重复代码多的问题,以下是精简且易维护的优化实现:
#include <stdio.h> #include <stdlib.h> // 用于abs函数 int main() { int fx, fy, zx, zy; int current_x, current_y; int step_count = 0; // 读取起始坐标 printf("请输入起始坐标Fx和Fy: "); scanf("%d %d", &fx, &fy); printf("%d 和 %d\n", fx, fy); // 读取目标坐标 printf("请输入目标坐标Zx和Zy: "); scanf("%d %d", &zx, &zy); printf("%d 和 %d\n", zx, zy); current_x = fx; current_y = fy; // 处理起始点即为目标点的情况 if (current_x == zx && current_y == zy) { printf("已在目标点,总步数:0\n"); return 0; } printf("移动路径:\n"); // 循环执行移动直到到达目标点 while (current_x != zx || current_y != zy) { // X方向向目标坐标靠拢 if (current_x < zx) current_x++; else if (current_x > zx) current_x--; // Y方向向目标坐标靠拢 if (current_y < zy) current_y++; else if (current_y > zy) current_y--; step_count++; printf("第%d步: X=%d, Y=%d\n", step_count, current_x, current_y); } printf("\n总步数:%d\n", step_count); return 0; }
优化点说明
- 移除全局变量:所有变量均在局部作用域内,降低代码耦合度,避免全局变量带来的意外修改风险
- 合并逻辑流程:用单个循环处理所有移动步骤,无需拆分对角线和直线移动的独立函数,大幅减少冗余代码
- 简化移动判断:每一步同时调整X、Y方向坐标,自然贴合8方向最短路径的逻辑(最短步数等于X/Y方向距离的最大值)
- 增加边界处理:直接判断起始点就是目标点的场景,避免无效循环
- 提升可读性:变量命名更直观,逻辑流程清晰易懂,便于后续维护和修改
内容的提问来源于stack exchange,提问作者TheLuckyGuy
相关产品推荐
相关产品推荐

