3752:走迷宫 DFS和BFS

邮差的信 提交于 2020-01-30 05:35:52

我是先用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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!