题目
有一个机器人,要穿越迷宫从起始点到终点,迷宫是由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;
}