多源BFS-- 矩阵距离

关于多源BFS,基本上就是单源BFS的简单升级了一下,比如在queue中队头开始时只有一个,我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数,一个一个去BFS。
题目思路:

这个题就直接把所有的1统计出来放进queue中,每次取出对头进行BFS即可,其中有两个问题:

1.我们BFS如何去找到他是0点,怎么通过0传递到下一个0。

2.如何保证他是最小值,会不会出现值覆盖的现象。

其实第一个问题我们可以直接用dist数组进行标记,一旦有0被靠近的1标记了,那么他自身我们就可以看作是个1,通过这个1我们再去找到下一个0。

第二个问题,不会出现覆盖,因为我们每次赋值之后dist就会变成附近1的dist值加1,dist!=-1(我们初始默认0的dist数组值为-1),我们每次都是取最近的,所以一旦到这个地方,其他的点就无法访问了,一旦访问便是最近距离。

千万别忘了判断数组是否越界,否则会导致段错误

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
char g[1010][1010];
int n,m;
int dist[1010][1010];
typedef pair<int,int> PII;
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
void bfs()
{
    memset(dist,-1,sizeof(dist));
    queue<PII> q;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(g[i][j]=='1')
            {
                q.push({i,j});
                dist[i][j]=0;
            }
        }
    }
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int x=t.first+dx[i];
            int y=t.second+dy[i];
            if(x<1||x>n||y<1||y>m)
            continue;
            if(dist[x][y]!=-1)
            {
                continue;
            }
            else
            {
                dist[x][y]=dist[t.first][t.second]+1;
                q.push({x,y});
            }
        }
    }
}
int main()
{

	cin>>n>>m;
	for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>g[i][j];
        }
    }
	bfs();
	for(int i=1;i<=n;i++)
	{
	    for(int j=1;j<=m;j++)
	    {
	        cout<<dist[i][j]<<" ";
	    }
	    cout<<endl;
	}
	return 0;
}
相关推荐
Zzz 小生16 分钟前
Lazy Theta*:把昂贵的视线检测留到“真正需要”时再做
人工智能·算法·贪心算法·推荐算法
l1258651 小时前
# LangGraph Deep Research Agent 全流程设计:多轮研究、人机协同与真实来源管理
数据库·人工智能·python·算法·自然语言处理·oracle·langchain
青少儿编程课堂2 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
evans在进步2 小时前
LeetCode 438 找到字符串中所有字母异位词:滑动窗口与排序解法详解
算法·leetcode·职场和发展
M78佐菲2 小时前
Linux多线程:创建、回收与互斥同步
linux·笔记·学习·算法
小手cool2 小时前
使用递归对数组进行反转操作
java·数据结构·算法
兔兔兔兔12 小时前
记录C++ 13
开发语言·c++·算法
码行山野赴时序归途2 小时前
从暴力到最优:三道 C 语言入门题的解法思路
c语言·开发语言·数据结构·算法·leetcode·排序算法
土司大王2 小时前
LeetCode hot100——随机链表的复制
算法·leetcode·链表
叠层归一研究院2 小时前
螺旋时空:E框架的整合宇宙论
人工智能·经验分享·算法·机器学习·agi