题目描述

定义一个二维数组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],既第一空格是可以走的路。
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

呃...挖个坑待补充吧,回溯写的还不是很好
没看清题 以为只能向右向下走 用了dfs居然也通过了
看来还是测试样例不够多
如果只考虑向右向下,和二叉树求路径差不多

#include<iostream>
#include<vector>
using namespace std;
bool flag;
void dfs(vector<vector<int>> nums, vector<pair<int, int>>& points, int i, int j) {
    if (flag) return;//已找到路径,return
    if (i >= nums.size() || j >= nums[0].size()) return;//遇到边界return
    points.push_back({ i,j });
    if (nums[i][j] == 1) {//碰到障碍物,此路不通,pop后return
        points.pop_back();
        return;
    }
    if (i == nums.size() - 1 && j == nums[0].size() - 1)//到达终点
    {
        for (auto i : points) {
            cout << '(' << i.first << ',' << i.second << ')' << endl;
        }
        flag = true;
        return;
    }
    dfs(nums, points, i + 1, j);//向右走
    dfs(nums, points, i, j + 1);//向下走
    points.pop_back();//不通,pop
}

int main() {
    int m, n;
    while (cin >> m >> n) {
        vector<vector<int>> nums(m, vector<int>(n, 0));
        vector<pair<int, int>> points;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cin >> nums[i][j];
            }
        }
        flag = false;
        dfs(nums, points, 0, 0);
    }
}