AcWing 1076. 迷宮問題 多源BFS
阿新 • • 發佈:2021-02-16
題目描述
給定一個N行M列的01矩陣A,A[i][j] 與 A[k][l] 之間的曼哈頓距離定義為:
輸出一個N行M列的整數矩陣B,其中:
輸入格式
第一行兩個整數n,m。
接下來一個N行M列的01矩陣,數字之間沒有空格。
輸出格式
一個N行M列的矩陣B,相鄰兩個整數之間用一個空格隔開。
資料範圍
樣例
輸入樣例:
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; }