我是先用DFS写的 因为我没用bfs写过这种题
后来想了想bfs也得练练 就看了别人的写了一遍
注释很详细
BFS
//第一次接触这个形式的bfs 有时候感觉用dfs要简单
//以前做的bfs都是关于图的
B
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int n, m;
string s[100];
int vis[100][100];
//用结构体来搞 以后每一层都是上一层的走的步数加1
struct f
{
int x, y;
int js;
};
//比较巧妙的是 上下左右 用了一个数组来搞
//一开始我想错了 想成了和8连通似的
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
int bfs(int x, int y)
{
//t1当之前的 t2是正准备走的
//一个也行 这样可能好理解一点吧
f t1, t2;
//一开始默认步数是1
t1.x = x, t1.y = y, t1.js = 1;
vis[x][y] = 1;
queue<f> q;
q.push(t1);
while (!q.empty())
{
t1 = q.front();
q.pop();
//遍历 上下左右
for (int i = 0; i < 4; ++i)
{
//这个用来控制方向
t2.x = t1.x + dir[i][0];
t2.y = t1.y + dir[i][1];
//步数增加
t2.js = t1.js + 1;
//注意到边上的时候 能走的时候 是否已经走过
if (((t2.x < 0 || t2.y < 0) || (t2.x >= n || t2.y >= m)) || s[t2.x][t2.y] != '.' || vis[t2.x][t2.y])
continue;
//如果这一圈正好到终点
//肯定就是最近的 因为第一个到终点的
if (t2.x == n - 1 && t2.y == m - 1)
return t2.js;
vis[t2.x][t2.y] = 1;
q.push(t2);
}
}
}
int main()
{
cin >> n >> m;
cin.get();
for (int i = 0; i < n; ++i)
{
getline(cin, s[i]);
}
cout << bfs(0, 0);
return 0;
}
DFS
#include <iostream>
using namespace std;
int n, m;
string s[100];
int vis[100][100];
int ans = 1 << 30;
void dfs(int x, int y, int js)
{
//走过的标记一下 和 单独开一个vis数组一样 这样少些点
s[x][y] = '*';
if (x == (n - 1) && y == (m - 1))
{
ans = min(ans, js);
return;
}
//上下左右四个方向
//控制方向有更方便的方法 懒得想了
if ((x - 1) >= 0 && s[x - 1][y] == '.')
dfs(x - 1, y, js + 1);
if ((x + 1) < n && s[x + 1][y] == '.')
dfs(x + 1, y, js + 1);
if ((y - 1) >= 0 && s[x][y - 1] == '.')
dfs(x, y - 1, js + 1);
if ((y + 1) < m && s[x][y + 1] == '.')
dfs(x, y + 1, js + 1);
}
int main()
{
cin >> n >> m;
cin.get();
for (int i = 0; i < n; ++i)
{
getline(cin, s[i]);
}
dfs(0, 0, 1);
cout << ans;
return 0;
}
来源:CSDN
作者:陌陌623
链接:https://blog.csdn.net/weixin_45653525/article/details/104108262