分析:这是一道比较基础的搜索题。但是我们要格外注意搜索的结束条件,越界检查,更新答案以及一个小技巧——边搜索边检查,如果确定不是最优解,停止这一层的搜索,也就是直接返回,不进行这一条件下的进一步搜索。
同时,还要定义一个标记数组来判断是否已经搜索过,以防止死循环的出现。
C++代码实现如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 15;
int map[N][N],visited[N][N] ,n, m; //visited为标记数组,判断是否走过
int ans = (int)2e9;
void dfs(int x,int y,int step) //x和y为现在的坐标,step为步数
{
if (step >= ans)return; //步数比答案大,则返回
if (!(x >= 1 && x <= n && y >= 1 && y <= m))
return; //越界,则返回
if (map[x][y])return; //不能走,则返回
if (visited[x][y])return; //已走过,则返回(防止死循环)
if (x == n && y == m)ans = min(ans, step); //更新答案
//遍历四个方向
visited[x][y] = 1; //标记(x,y)已走过
dfs(x + 1, y, step + 1);
dfs(x - 1, y, step + 1);
dfs(x, y + 1, step + 1);
dfs(x, y - 1, step + 1);
visited[x][y] = 0; //回溯
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= m;j++)
cin >> map[i][j];
dfs(1, 1, 0);
cout << ans << endl;
return 0;
}
好了,今天的分享就到这里,谢谢观看!