1. 程式人生 > 其它 >AcWing 1076. 迷宮問題 多源BFS

AcWing 1076. 迷宮問題 多源BFS

技術標籤:演算法多源bfsAcWing

題目描述
給定一個N行M列的01矩陣A,A[i][j] 與 A[k][l] 之間的曼哈頓距離定義為:

dist(A[i][j],A[k][l])=|i-k|+|j-l|

輸出一個N行M列的整數矩陣B,其中:

B[i][j]=min_{1\leq x\leq N,1\leq y\leq M,A[x][y]=1}dist(A[i][j],A[x][y])

輸入格式
第一行兩個整數n,m。

接下來一個N行M列的01矩陣,數字之間沒有空格。

輸出格式
一個N行M列的矩陣B,相鄰兩個整數之間用一個空格隔開。

資料範圍
1 \leq N,M \leq 1000
樣例
輸入樣例:
3 4
0001
0011
0110
輸出樣例:
3 2 1 0
2 1 0 0
1 0 0 1

思路:多源bfs,其實多源和單源一樣,沒什麼了不起的,預處理入隊 (距離為0)即可

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
#define x first
#define y second
typedef pair<int,int> pii;
int n,m,dis[N][N];;
char g[N][N];
void bfs(){
    queue<pii>q;
    int nx[4]={-1,1,0,0},ny[4]={0,0,1,-1};
    memset(dis,-1,sizeof dis);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(g[i][j]=='1'){
                q.push({i,j});
                dis[i][j]=0;
            }
        }
    }
    while(!q.empty()){
        auto now=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int a=now.x+nx[i],b=now.y+ny[i];
            if(a<0||b<0||a>n-1||b>m-1)continue;
            if(dis[a][b]!=-1||g[a][b]=='1')continue;
            dis[a][b]=dis[now.x][now.y]+1;
            q.push({a,b});
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>g[i];
    }
    bfs();
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<dis[i][j]<<' ';
        }
        puts("");
    }
    return 0;
    
}