AcWing 173 矩陣距離

2021-10-03 13:54:19 字數 1472 閱讀 1413

題目描述:

給定乙個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]=min1≤x≤n,1≤y≤m,a[x][y]=1dist(a[i][j],a[x][y])

輸入格式

第一行兩個整數n,m。

接下來乙個n行m列的01矩陣,數字之間沒有空格。

輸出格式

乙個n行m列的矩陣b,相鄰兩個整數之間用乙個空格隔開。

資料範圍

1≤n,m≤1000

輸入樣例:

3 4

0001

0011

0110

輸出樣例:

3 2 1 0

2 1 0 0

1 0 0 1

分析:

題目給定乙個01矩陣,要求每個位置到距離最近1的曼哈頓距離,是多源最短路問題。解決多源最短路問題只需要將所有源點先入隊,然後再按照尋常的bfs求最短路徑即可。本題的搜尋思路無非是兩種,第一種是從某個位置出發,搜尋到1為止,就求出了這個點裡最近1的最短曼哈頓距離,這樣搜尋冗餘度高;另一種思路就是從某個1所在位置出發,然後bfs完所有的位置,求出了所有點裡這個1的距離,顯然第二種思路暴力的話,矩陣有多少個1就只需做幾次bfs。當然多源bfs的解法就是在第二種思路上改進的。

回憶下bfs的思路,從起點出發,然後將裡起點距離是1的點都加入佇列,再將裡起點距離是2的點都加入佇列,...,顯然這樣求出的距離肯定是最短距離。現在有多個起點,所有1所在的位置都是起點,將所有的起點都加入佇列,然後將離這些起點中距離是1但沒有訪問過的點都加入到佇列,然後是距離是2的點,顯然進行下去每個位置上的點都能找到離它最近的1的距離。這種做法可以理解為從多個源點同時做bfs,自然求得的就是最短路徑,儘管入隊順序有先後,但離第乙個源點距離是d的點和離第二個源點距離是d的點加入佇列時他們都是作為離源點等距離的點加入的,更新的距離也相同,做到同批次進行bfs。

另外,儘管本題輸入的是01矩陣,但兩個數之間沒有空格,所以也需要用字元陣列讀入。

#include #include #include using namespace std;

const int n = 1005;

typedef pairpii;

char g[n][n];

int n,m,d[n][n];

int dx = ;

int dy = ;

pii q[n * n];

void bfs();

d[i][j] = 0;}}

}while(hh <= tt);

d[nx][ny] = d[t.first][t.second] + 1;}}

}int main()

printf("\n");

}return 0;

}

AcWing 173 矩陣距離(bfs)

給定乙個n行m列的01矩陣a,a i j 與 a k l 之間的曼哈頓距離定義為 di st a i j a k l i k j l dist a i j a k l i k j l dist a i j a k l i k j l 輸出乙個n行m列的整數矩陣b,其中 b i j mi n1 x n...

AcWing 173 矩陣距離 多源bfs模板

acwing 173.矩陣距離 給定乙個n行m列的01矩陣a,a i j 與 a k l 之間的曼哈頓距離定義為 d is t a i j a k l i k j l dist a i j a k l i k j l dist a i j a k l i k j l 輸出乙個n行m列的整數矩陣b,其...

ACWING196 質數距離

給定兩個整數l和u,你需要在閉區間 l,u 內找到距離最接近的兩個相鄰質數c1和c2 即c2 c1是最小的 如果存在相同距離的其他相鄰質數對,則輸出第一對。同時,你還需要找到距離最遠的兩個相鄰質數d1和d2 即d1 d2是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...