搜索:矩阵距离

题型模板:类似于矩阵中多个点到其他点的距离题型

解法:将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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值