html5制作手機網(wǎng)站教程十大輿情網(wǎng)站
原題鏈接:173. 矩陣距離 - AcWing題庫
給定一個?N行?M?列的?01矩陣?A,A[i][j] 與?A[k][l]]之間的曼哈頓距離定義為:
dist(i,j,k,l)=|i?k|+|j?l||
輸出一個?N?行?M?列的整數(shù)矩陣?B,其中:
B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(i,j,x,y)
輸入格式
第一行兩個整數(shù)?N,M
接下來一個?N?行?M?列的?01 矩陣,數(shù)字之間沒有空格。
輸出格式
一個?NN?行?MM?列的矩陣?B,相鄰兩個整數(shù)之間用一個空格隔開。
數(shù)據(jù)范圍
1≤N,M≤1000
輸入樣例:
3 4
0001
0011
0110
輸出樣例:
3 2 1 0
2 1 0 0
1 0 0 1
#include<iostream>
#include<algorithm>
#include<cstring>// 定義宏,方便使用pair的first和second成員
#define x first
#define y secondusing namespace std;// 定義一個pair<int, int>類型的別名PII
typedef pair<int,int> PII;// 定義常量N和M,N表示網(wǎng)格的最大行數(shù),M表示隊列的最大大小
const int N = 1010, M = N*N;// 定義全局變量n和m,分別表示網(wǎng)格的行數(shù)和列數(shù)
int n, m;// 定義一個二維字符數(shù)組g,用于存儲網(wǎng)格中的字符
char g[N][N];// 定義一個隊列q,用于廣度優(yōu)先搜索
PII q[M];// 定義一個二維整數(shù)數(shù)組dist,用于存儲每個位置到最近的'1'的距離
int dist[N][N];// 定義廣度優(yōu)先搜索函數(shù)bfs
void bfs()
{// 初始化dist數(shù)組,所有位置的距離設(shè)為-1memset(dist, -1, sizeof dist);// 定義隊列的頭指針hh和尾指針ttint hh = 0, tt = -1;// 遍歷整個網(wǎng)格,將所有值為'1'的位置加入隊列,并將它們的距離設(shè)為0for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (g[i][j] == '1'){dist[i][j] = 0;q[++tt] = {i, j};}}}// 定義四個方向的移動數(shù)組dx和dyint dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};// 開始廣度優(yōu)先搜索while (hh <= tt){// 取出隊列頭部元素auto t = q[hh++];// 遍歷四個方向for (int i = 0; i < 4; i++){// 計算新位置的坐標int a = t.x + dx[i], b = t.y + dy[i];// 如果新位置超出網(wǎng)格范圍,則跳過if (a < 0 || a >= n || b < 0 || b >= m) continue;// 如果新位置已經(jīng)訪問過,則跳過if (dist[a][b] != -1) continue;// 更新新位置的距離,并將其加入隊列dist[a][b] = dist[t.x][t.y] + 1;q[++tt] = {a, b};}}
}// 主函數(shù)
int main()
{// 讀取網(wǎng)格的行數(shù)和列數(shù)scanf("%d %d", &n, &m);// 讀取網(wǎng)格中的字符for (int i = 0; i < n; i++){scanf("%s", g[i]);}// 調(diào)用廣度優(yōu)先搜索函數(shù)bfs();// 輸出每個位置到最近的'1'的距離for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){printf("%d ", dist[i][j]);}printf("\n");}return 0;
}