#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 100000
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
ll n,m;
string e[1005];
int dis[1005][1005];
int vis[1005][1005];
struct node{
int x,y,num;
friend bool operator <(const node a,const node b)
{
return a.num>b.num;
}
};
priority_queue<node>qu;
int dx[5]={1,-1,0,0};
int dy[6]={0,0,-1,1};
bool check(int x,int y)
{
if(x<0||y<0||x>=n||y>=m)
return false;
return true;
}
void bfs()
{
while(qu.size())
{
node c=qu.top();
qu.pop();
int x=c.x;
int y=c.y;
int num=c.num;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy)&&!vis[xx][yy])
{
//cout<<x<<" "<<y<<"--------->"<<xx<<" "<<yy<<" "<<dis[xx][yy]<<" "<<num+1<<endl;
if(num+1<dis[xx][yy])
{
dis[xx][yy]=num+1;
qu.push({xx,yy,num+1});
}
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
memset(vis,0,sizeof vis);
for(int i=0;i<n;i++)
{
cin>>e[i];
for(int j=0;j<m;j++)
{
if(e[i][j]=='1')
{
dis[i][j]=0;
qu.push({i,j,0});
vis[i][j]=1;
}
else
dis[i][j]=INF;
}
}
bfs();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(j)
cout<<" ";
cout<<dis[i][j];
}
cout<<endl;
}
return 0;
}
矩阵距离(bfs)
最新推荐文章于 2024-09-07 10:59:43 发布