题目
题解思路
学长讲的真的好
把高度看成最短路,最短的点延申出的必然是最短路。
AC代码
#define PII pair< int, pair<int ,int > >
class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
int n = heightMap.size() , m = heightMap[0].size() ;
vector<vector<int>>& a = heightMap ;
int dx[4] = { 0 , 0 , -1 , 1 } ;
int dy[4] = { 1 , -1 , 0 , 0 } ;
long long ans = 0 ;
int vis[n][m] ;
priority_queue < PII , vector<PII> , greater<PII> > q ;
for (int i = 0 ; i < n ; i++ )
for (int j = 0 ; j < m ; j++ )
vis[i][j] = 0 ;
for (int i = 0 ; i < n ; i++ )
{
for (int j = 0 ; j < m ; j++ )
{
if ( i == 0 || j == 0 || i == n-1 || j == m -1 )
{
q.push({a[i][j] , {i,j} }) ;
vis[i][j] = 1 ;
}
}
}
while (!q.empty())
{
auto tmp = q.top();
q.pop();
int tx = tmp.second.first ;
int ty = tmp.second.second ;
int mi = 1e6 ;
for (int i = 0 ; i < 4 ; i++ )
{
int fx = tx + dx[i] ;
int fy = ty + dy[i] ;
if ( fx >= 0 && fy >= 0 && fx < n && fy < m && !vis[fx][fy] )
{
if ( a[fx][fy] < tmp.first )
{
ans += tmp.first - a[fx][fy] ;
}
vis[fx][fy] = 1 ;
q.push({ max( a[fx][fy] , tmp.first ) , {fx,fy} } ) ;
}
}
}
return ans ;
}
};