目錄
題目1 : 水陸距離
時間限制:10000ms
單點時限:1000ms
內存限制:256MB
描述
給定一個N x M的01矩陣,其中1表示陸地,0表示水域。對於每一個位置,求出它距離最近的水域的距離是多少。
矩陣中每個位置與它上下左右相鄰的格子距離爲1。
輸入
第一行包含兩個整數,N和M。
以下N行每行M個0或者1,代表地圖。
數據保證至少有1塊水域。
對於30%的數據,1 <= N, M <= 100
對於100%的數據,1 <= N, M <= 800
輸出
輸出N行,每行M個空格分隔的整數。每個整數表示該位置距離最近的水域的距離。
樣例輸入
4 4
0110
1111
1111
0110
樣例輸出
0 1 1 0
1 2 2 1
1 2 2 1
0 1 1 0
題意分析:
1.題是什麼?
給你一個n行m列的矩陣,1陸地,0水域,要你計算出每個陸地距離最近的水域的距離,連通方式是四連通.
2.思路
如果只有一個水域,那不就是單純的Dijkstra模版題嗎,這道其實就是多源最短路徑問題,我的解決方法是以dijkstra思路進行優化,依舊是依靠一個隊列進行向周邊的擴散.
ac代碼:
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
typedef pair<int,int> pa;
const int maxn=802,maxm=802;
const int path[4][2]={1,0,0,-1,-1,0,0,1};//四方向數組
char ma[maxn][maxm];
int dis[maxn][maxm];
void solve(){
//獲取輸入
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",&ma[i]);
//初始dis數組與queue
queue<pa> q;
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
if(ma[i][j]=='0'){
dis[i][j]=0;
q.push(make_pair(i,j));
}
else if(ma[i][j]=='1') dis[i][j]=-1;
}
//多源bfs
while(!q.empty()){
pa temp=q.front();
q.pop();
for(int i=0;i<4;i++){
int tx=temp.first+path[i][0],ty=temp.second+path[i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&dis[tx][ty]==-1){
dis[tx][ty]=dis[temp.first][temp.second]+1;
q.push(make_pair(tx,ty));
}
}
}
//輸出dis
for(int i=0;i<n;i++){
printf("%d",dis[i][0]);
for(int j=1;j<m;j++) printf(" %d",dis[i][j]);
printf("\n");
}
}
int main(){
solve();
return 0;
}