--- title: leetcode 407 tags: leetcode, priority queue --- ```c++ // https://leetcode.com/problems/trapping-rain-water-ii/ using pii = pair<int, int>; struct Node { int value; int x, y; }; const int go[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; class Solution { private: int n, m; bool check(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; } public: int trapRainWater(vector<vector<int>>& heightMap) { n = heightMap.size(); if (n <= 2) return 0; m = heightMap[0].size(); if (m <= 2) return 0; bool visit[110][110] = {false}; auto cmp = [](Node left, Node right) { return left.value > right.value; }; priority_queue<Node, vector<Node>, decltype(cmp)> q(cmp); for (int i=0; i<m; i++) { q.push({heightMap[0][i], 0, i}); q.push({heightMap[n-1][i], n-1, i}); visit[0][i] = true; visit[n-1][i] = true; } for (int i=0; i<n; i++) { q.push({heightMap[i][0], i, 0}); q.push({heightMap[i][m-1], i, m-1}); visit[i][0] = true; visit[i][m-1] = true; } int ans = 0; while (q.size()) { Node now = q.top(); q.pop(); int x = now.x; int y = now.y; int value = now.value; for (int i=0; i<4; i++) { int xx = x + go[i][0]; int yy = y + go[i][1]; if (check(xx, yy) && !visit[xx][yy]) { if (heightMap[xx][yy] < value) { ans += value - heightMap[xx][yy]; q.push({value, xx, yy}); } else { q.push({heightMap[xx][yy], xx, yy}); } visit[xx][yy] = true; } } } return ans; } };