C语言矩阵中起点到终点的0路径检测程序问题排查求助
问题排查与修复
你的程序输出不符合预期的核心原因有两个,下面逐一分析并给出修复方案:
1. 起始点合法性未校验,且测试用例起始点不符合路径要求
你的测试用例中起始坐标(0,0)对应的矩阵值是1,但DFS逻辑一开始就判断adj[i][j] != 0就直接返回,导致整个DFS根本没有执行任何遍历操作,visited数组全程保持初始的false,自然目标点(3,3)不会被标记为已访问。
同时你也没有提前校验起始点和目标点本身是否为0——如果这两个点任意一个不是0,直接就不存在符合要求的路径。
2. 方向注释完全错误
DFS中四个方向的注释和实际移动方向不匹配:
i - 1, j是向上移动(原注释写“Move left”)i + 1, j是向下移动(原注释写“Move Right”)i, j - 1是向左移动(原注释写“Move top”)i, j + 1是向右移动(原注释写“Move bottom”)
修复后的完整代码
#include <stdio.h> #include <stdbool.h> #define N 5 void dfs(int adj[][N], int i, int j, bool visited[][N]); bool hasPathDfs(int adj[][N], int sx, int sy, int dx, int dy); int main() { int matrix[N][N] = { {1, 0, 0, 0, 0}, {2, 3, 0, 3, 1}, {0, 4, 0, 0, 0}, {0, 0, 0, 2, 4}, {5, 0, 0, 2, 5}}; // 把起始点改为(0,1),对应矩阵值为0,符合路径要求 int sx = 0, sy = 1, dx = 3, dy = 3; printf("Find path from (%d,%d) to (%d,%d):\n", sx, sy, dx, dy); printf("DFS: %s\n", hasPathDfs(matrix, sx, sy, dx, dy) ? "true" : "false"); return 0; } void dfs(int adj[][N], int i, int j, bool visited[][N]) { // 越界、非0、已访问则返回 if (i < 0 || i >= N || j < 0 || j >= N || adj[i][j] != 0 || visited[i][j]) { return; } visited[i][j] = true; dfs(adj, i - 1, j, visited); // 向上 dfs(adj, i + 1, j, visited); // 向下 dfs(adj, i, j - 1, visited); // 向左 dfs(adj, i, j + 1, visited); // 向右 } bool hasPathDfs(int adj[][N], int sx, int sy, int dx, int dy) { // 提前校验起始点和目标点是否为0,直接排除不可能的情况 if (adj[sx][sy] != 0 || adj[dx][dy] != 0) { return false; } bool visited[N][N]; int i,j; for ( i = 0; i < N; i++) { for ( j = 0; j < N; j++) { visited[i][j] = false; } } dfs(adj, sx, sy, visited); return visited[dx][dy]; }
修复说明
- 在
hasPathDfs开头增加了起始点和目标点的合法性校验,避免无效的DFS遍历。 - 修正了DFS中的方向注释,保证逻辑可读性。
- 修改了
main函数中的起始点为(0,1)(对应矩阵值为0),此时运行程序会输出true,符合预期的路径存在判断。
内容的提问来源于stack exchange,提问作者alperone12
相关产品推荐
相关产品推荐

