求解,为啥答案总是r啊,是BFS写错了吗?
查看原帖
求解,为啥答案总是r啊,是BFS写错了吗?
755222
Lawate楼主2023/3/19 21:09
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a[505][505];
int sta[505][505];
bool vis[505][505];
pair<int, int> q[505 * 505];
int hh, tt;
int n, m;
int t;
int tiaoguo;
int dx[4] = { 0,-1,1,0 };
int dy[4] = { -1,0,0,1 };
bool bfs(int x, int y, int mid)
{
    int f = 1;//记录走过标志数
    q[0] = { x,y };
    vis[x][y] = true;
    while (hh <= tt)
    {
        auto Q = q[hh++];//存入同时出队
        for (int i = 0; i < 4; i++)
        {
            int xx = Q.first + dx[i];
            int yy = Q.second + dy[i];
            if (xx < 0 || xx >= n || yy < 0 || yy >= m)
            {
                continue;
            }
            if (abs(a[xx][yy] - a[Q.first][Q.second]) > mid)
            {
                continue;
            }
            if (vis[xx][yy])
            {
                continue;
            }//前几if,看能不能走
            if (sta[xx][yy] == 1)
            {
                f++;
                if (f == t)
                {
                    return true;
                }
            }
            q[++tt] = { xx,yy };
            vis[xx][yy] = true;
        }
    }
    return false;
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> a[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> sta[i][j];
            if (sta[i][j] == 1)
            {
                t++;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (tiaoguo)
        {
            break;
        }
        for (int j = 0; j < m; j++)
        {
            if (sta[i][j] == 1)//找到第一个路标,开始BFS
            {
                int l = -1, r = 1e9 + 1;//这题难点在二分,这个难度系数并不是靠BFS探出来,而是不断二分出,然后判断
                while (l < r)
                {
                    int mid = (l + r )/ 2;
                    //每次BFS前重置
                    memset(vis, false, sizeof(vis));
                    memset(sta, 0, sizeof(sta));
                    memset(q, 0, sizeof(q));//这个记得,我们放进去了的,只是指针移动
                    hh = 0, tt = 0;
                    if (bfs(i, j, mid))
                    {
                        r = mid;//如果符合,让r=它,毕竟,可能它左边的也符合,因为是找最小哦
                    }
                    else
                    {
                        l = mid + 1;
                    }
                }
                cout << l;
                tiaoguo = 1;
                break;
            }
        }
    }
    return 0;
}
感谢大佬!!!
2023/3/19 21:09
加载中...