算法:迷宫

题目
有一个机器人,要穿越迷宫从起始点到终点,迷宫是由0和1组成的二维数组arr,0表示空地,1表示障碍物,给定出发点坐标(xStart,yStart)和终点坐标(xEnd,yEnd),机器人可以向上、下、左、右移动,机器人从起始点到终点的最短路径是多少?

思路
机器人从起始点出发,正常情况下可以朝4个方向移动,移动到下个位置又可以朝4个方向移动,不断重复,当机器人的坐标和终点坐标相等时,即到达终点,此时有一个路径值,比较所有的路径值,得到最小值,即答案。

代码

vector<vector<int>> directions = {{0,1},{0,-1},{1,0},{-1,0}};
int minP = INT_MAX;
vector<vector<int>> book;
void dfsMinPath(vector<vector<int>>& arr,int xStart,int yStart,int xEnd,int yEnd, int step) {
    if (xStart == xEnd && yStart == yEnd) {
        if (minP > step) {
            minP = step;
        }
        return;
    }
    for(auto direction : directions) {
        int nX = xStart + direction[0];
        int nY = yStart + direction[1];
        if (nX < 0 || nX >= arr.size() || nY < 0 || nY >= arr.size()) {
            //出界了
            continue;
        }
        if (book[nX][nY] == 0 && arr[nX][nY] == 0) {
            book[nX][nY] = 1;
            dfsMinPath(arr, nX, nY, xEnd, yEnd, step + 1);
            book[nX][nY] = 0;
        }
    }
}
int minPath(vector<vector<int>>& arr,int xStart,int yStart,int xEnd,int yEnd) {
    book.resize(arr.size(),vector<int>(arr[0].size(),0));
    dfsMinPath(arr, xStart, yStart, xEnd, yEnd, 0);
    return minP;
}