【題目描述】
有一塊矩形土地被劃分成 n×m 個正方形小塊。這些小塊高低不平,每一小塊都有自己的高度。水流可以由任意一塊地流向周圍四個方向的四塊地中,但是不能直接流入對角相連的小塊中。
一場大雨後,由於地勢高低不同,許多地方都積存了不少降水。假如你已經知道這塊土地的詳細資訊,你能求出每個小塊的積水高度嗎?
注意:假設矩形地外圍的高度為 0。
【輸入格式】第一行包含兩個非負整數 n,m。
接下來 n 行每行 m個整數表示第 i 行第 j 列的小塊的高度。
【輸出格式】輸出 n 行,每行 m個由空格隔開的非負整數,表示每個小塊的積水高度。
【樣例輸入】3 3
4 4 0
2 1 3
3 3 -1
【樣例輸出】0 0 0
0 1 0
0 0 1
【資料範圍】對於 20%的資料 n,m<=4
對於 40%的資料 n,m<=15
對於 60%的資料 n,m<=50
對於 100%的資料 n,m<=300 小塊高度的絕對值<=10^9
在每一部分資料中,均有一半資料保證小塊高度非負
1:將負數坑填平;因為最外面一圈是0,所以可以隨便填
2:將最外面一圈(1~m,1~n之間)的點加到小根堆中
3:取出堆頂從堆頂連的四個方向灌水,如果碰見不比它低的點,將其入堆,否則向其中灌水,說明:ans[i][j]+=h-map[i][j]的原因是之前填了負數坑,如果全部資料為正數,則直接ans[i][j]=h-map[i][j]即可
4:輸出結果
具體問題看**
附:stl priority_queue
#include
#include
#include
#define inf 0x7fffffff;
using
namespace
std;
struct data
int x,y,v;
};int u[4]=,v[4]=;
int minn,minx,miny;
priority_queueque;
int n,m,ss;
intmap[500][500],ans[500][500];
bool pd[500][500];
void pre()
for(j=2;j0;in.y=j;
in.v=map[0][j];pd[0][j]=1;
que.push(in);
in.x=n;in.y=j;
in.v=map[n][j];pd[n][j]=1;
que.push(in);
}}bool inmap(data a)
void fill(data z,int h)
ans[xx][yy]+=h-map[xx][yy];
for(i=0;i<4;i++)
}}void solve()}}
}void out()
printf("\n");
}}int main()
}pre();
solve();
out();
return
0;}
排隊打水問題(water)
有n個人排隊到m個水龍頭去打水,他們裝滿水桶的時間t1,t2 tn為整數且各不相同,應如何安排他們的打水順序才能使他們花費的總時間最少?只有一組輸入資料哦。4 2 n m 2 6 4 5 t1 t2 tn 23 所有人的花費時間總和 int a maxn 接水的人 int b maxn 等待接水的時...
演算法 蓄水問題
問題 給定乙個陣列,想象成乙個桶。問最多能裝多少水?例 1,5,3,6 最多裝2格水 oo o o o o o o o o o o o o o 解題思路 我們把每一列當成一塊板,根據分析,第一塊板和最後一塊板一定不能蓄水,所以問題變成了所有板所能蓄水最大值的總和。先明確這個思路,之後再想辦法。那麼如...
坦克問題與蓄水問題
問題1 某次戰役中,為便於資訊互動,我軍偵察部門將此次戰役的關鍵高地座標設定為 x 0,y 0 並規定,每向東增加100公尺,x加1,每向北增加100公尺,y加1。同時,我軍情報部門也破譯了敵軍向坦克傳送的指揮訊號,其中有三種訊號 l,r,m 用於控制坦克的運動,l 和 r 分別表示使令坦克向左 向...