hiho236 水陸距離

目錄

題目1 : 水陸距離

題意分析:

1.題是什麼?

2.思路

ac代碼:


題目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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章