迷宫问题--Dfs

    科技2022-07-14  132

    链接:https://www.nowcoder.com/questionTerminal/cf24906056f4488c9ddb132f317e03bc 来源:牛客网

    定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:

    int maze[5][5] = {

    0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,

    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

    Input

    一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    0 1 0 0 0

    0 1 0 1 0

    0 0 0 0 0

    0 1 1 1 0

    0 0 0 1 0

    Sample Output

    (0, 0)

    (1, 0)

    (2, 0)

    (2, 1)

    (2, 2)

    (2, 3)

    (2, 4)

    (3, 4)

    (4, 4)

    #include<iostream> #include<vector> #include<stdio.h> using namespace std; int r = 0, c = 0; vector<vector<int>> maze; vector<vector<int>> road; vector<vector<int>> road_best; void Dfs(int i, int j) { //标记走过的路 maze[i][j] = 1; //记录路径 road.push_back({ i,j }); //如果走到出口 if (i == r - 1 && j == c - 1) //更新最短路径 if (road_best.empty() || (road.size() < road_best.size())) road_best = road; //方格类搜索题,上下左右四个方向搜索 if (i - 1 >= 0 && maze[i - 1][j] == 0) Dfs(i - 1, j); if (i + 1 < r && maze[i + 1][j] == 0) Dfs(i + 1, j); if (j - 1 >= 0 && maze[i][j - 1] == 0) Dfs(i, j - 1); if (j + 1 < c && maze[i][j + 1] == 0) Dfs(i, j + 1); //如果当前路走不通,回退找其他路径 maze[i][j] = 0; road.pop_back(); } int main() { while (cin >> r >> c) { maze = vector<vector<int>>(r, vector<int>(c, 0)); //清空路径 road.clear(); road_best.clear(); for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { cin >> maze[i][j]; } } Dfs(0, 0); for (auto i : road_best) printf("(%d,%d)\n", i[0], i[1]); } return 0; }
    Processed: 0.025, SQL: 8