題目描述:
給定乙個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是最大的 如果存在相同距離的其他相鄰質數對,則輸出第一對。輸入格式 每行輸入兩個...