[CSP-S模擬測試]:water(BFS)

題目描述

有一塊矩形土地被劃分紅$n\times m$個正方形小塊。這些小塊高低不平,每一小塊都有本身的高度。水流能夠由任意一塊地流向周圍四個方向的四塊地中,可是不能直接流入對角相連的小塊中。
一場大雨後,因爲地勢高低不一樣,許多地方都積存了很多降水。給定每一個小塊的高度,求每一個小塊的積水高度。
注意:假設矩形地外圍無限大且高度爲$0$。
c++


輸入格式

第一行包含兩個非負整數$n,m$。
接下來$n$行每行$m$個整數表示第$i$行第$j$列的小塊的高度。
spa


輸出格式

輸出$n$行,每行$m$個由空格隔開的非負整數,表示每一個小塊的積水高度。blog


樣例

樣例輸入:隊列

3 3
4 4 0
2 1 3
3 3 -1
it

樣例輸出:class

0 0 0
0 1 0
0 0 1
queue


數據範圍與提示

對於$20\%$的數據$n,m\leqslant 4$。
對於$40\%$的數據$n,m\leqslant 15$。
對於$60\%$的數據$n,m\leqslant 50$。
對於$100\%$的數據$n,m\leqslant 300$,$|$小塊高度$|\leqslant {10}^9$。
在每一部分數據中,均有一半數據保證小塊高度非負。
im


題解

首先須要明確一個問題,每個塊的最終高度就是全部從這個塊走出這個矩形當中的最大高度的最小值(通讀左邊這句話三遍!!!)。數據

而後我利用了相似$SPFA$的思想進行$BFS$,先將最外面一圈加入隊列,而後去更新它所能更新四個點的答案,若是一個點被更新,那麼就從新將這個點壓入隊列便可。di

時間複雜度:$\Theta(n\times m\times k)$($k$爲較小常數,其實時間複雜度我也不太會證,畢竟是類$SPFA$思想)。

指望得分:$100$分。

實際得分:$100$分。


代碼時刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long Map[500][500];
long long dis[500][500];
queue<pair<int,int> > q;
void BFS()
{
	while(!q.empty())
	{
		pair<int,int> flag=q.front(),wzc;
		q.pop();
		wzc=make_pair(flag.first-1,flag.second);
		if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
			if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
			{
				dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
				q.push(wzc);
			}
		wzc=make_pair(flag.first,flag.second-1);
		if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
			if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
			{
				dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
				q.push(wzc);
			}
		wzc=make_pair(flag.first+1,flag.second);
		if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
			if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
			{
				dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
				q.push(wzc);
			}
		wzc=make_pair(flag.first,flag.second+1);
		if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
			if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
			{
				dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
				q.push(wzc);
			}
	}
}
int main()
{
	memset(dis,0x3f,sizeof(dis));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%lld",&Map[i][j]);
	for(int i=1;i<=n;i++)
	{
		dis[i][1]=max(0LL,Map[i][1]);
		dis[i][m]=max(0LL,Map[i][m]);
		q.push(make_pair(i,1));
		q.push(make_pair(i,m));
	}
	for(int i=1;i<=m;i++)
	{
		dis[1][i]=max(0LL,Map[1][i]);
		dis[n][i]=max(0LL,Map[n][i]);
		q.push(make_pair(1,i));
		q.push(make_pair(n,i));
	}
	BFS();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
			printf("%lld ",max(0LL,dis[i][j]-Map[i][j]));
		puts("");
	}
	return 0;
}

rp++

相關文章
相關標籤/搜索