题型模板:类似于矩阵中多个点到其他点的距离题型
解法:将dist全部初始化为-1,将初始满足条件的点的距离设为0,加入队列。随后根据dist是否更新过是否为0更新距离且加入队列继续更新。
即从多个目标点往其他点寻找点根更新
(所有题中截图均来自于Acwing)
经典模板题
矩阵距离
思路:这道题的意思为找到每个点到最近的1的哈密顿距离,哈密顿距离意为x轴间距离和y轴间距离绝对值之和。先将每个值 为1的点的距离设为0,将这些1的点加入队列,再从这些队列去找其他可以更新的点,更新后加入队列
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 1010;
int n,m,dist[N][N];
char g[N][N];
PII q[N*N];
int hh=0,tt=-1;
void bfs(){
//4个方向
int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
while(hh<=tt){
auto t=q[hh++];
for(int i=0;i<4;i++){
int tox=t.x+dir[i][0];
int toy=t.y+dir[i][1];
//判段是否越界,判段是否更新过
if(tox<0||toy<0||tox>=n||toy>=m) continue;
if(dist[tox][toy]!=-1) continue;
if(g[tox][toy]=='0'){
dist[tox][toy]=dist[t.x][t.y]+1;
q[++tt]={tox,toy};
}
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
memset(dist,-1,sizeof dist);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]=='1'){
//如果是1则更新距离为0,且加入队列
q[++tt]={i,j};
dist[i][j]=0;
}
}
}
bfs();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<dist[i][j]<<" ";
}
cout<<endl;
}
}