啊哈算法—解救小哈(深度优先搜索)

解救小哈 【啊哈算法—解救小哈(深度优先搜索)】小哈在一个(m * n)大小的迷宫(0 ? m, n ? 50)里迷路了。在迷宫中,每个单元格要么是空地,要么是障碍物。现在要找到从起点到小哈位置的最短步数。
思路:
使用递归一步一步向前试探,试探成功则步数加一,返回后向另一个方向试探,到达终点后比较最小步数。
源码:

#includeint n, m, p, q, min = _CRT_INT_MAX; int a[51][51], book[51][51]; void dfs(x, y, step); void dfs(x, y, step) { int next[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} }; //控制下一步走的方向 int tx, ty; //下一步坐标 int k; if (x == p && y == q) {//到达终点 if (step < min) { min = step; //更新最小值 } return; } for (k = 0; k < 3; k++) {//循环尝试下一步 tx = x + next[k][0]; ty = y + next[k][1]; if (tx < 1 || tx > n || ty < 1 || ty > m) {//判断是否出界 continue; } if (a[tx][ty] == 0 && book[tx][ty] == 0) {//判断是否为障碍物或已走过 book[tx][ty] = 1; //标记此格已走过 dfs(tx, ty, step + 1); book[tx][ty] = 0; //取消尝试 } } return; }int main() { int i, j; int startx, starty; printf("请输入迷宫大小\n"); scanf("%d %d", &n, &m); //输入迷宫大小 printf("请输入迷宫\n"); for (i = 1; i <= n; i++) {//输入迷宫 for (j = 1; j <= m; j++) { scanf("%d", &a[i][j]); } } printf("请输入终点:"); scanf("%d %d", &p, &q); //输入终点; printf("请输入起点:"); scanf("%d %d", &startx, &starty); dfs(startx, starty, 0); printf("最小路径:%d", min); return 0; }

    推荐阅读