water3
Time Limit: 1000ms
Memory Limit: 65536KB
Description
Input
Sample Input
6 5 4 4 4 3 3 4 2 9 1 3 4 1 9 1 3 2 6 3 8 2 2 1 7 1 2 2 1 2 2 2 5 4 5 8 7 7 5 2 1 5 7 1 7 1 8 9 6 9 9 8 9 9
网址https://icpc.njust.edu.cn/Contest/751/I/
题目大意:
问这个矩阵内部可以储存多少的水。
思路:
我们用vis表示已经访问过的点。然后将所有的点都bfs一遍,其中遍历的时候有一下条件
①不能超出矩阵的范围,那就continue
②如果搜索到了边缘,且边缘的值小于我们最初开始bfs的值,那就return
③因为搜索的时候会遇到在中心的一个坑,比如说测试数据中的第二组数据。其中的那个3的周围被4个比他大的值包围了,那么我们就要搜出周围比他大的最小值。
然后有了这些条件以后,我们每次修改高度的时候都把它修改成当前所要到的这个高度就可以了,这样就不需要多一个数组来考虑了。
#include #include #include #include #include #include using namespace std; typedef pair P; const int inf = 0x3f3f3f3f; const int maxn = 300 + 5; int n, m; int atlas[maxn][maxn]; bool vis[maxn][maxn]; long long res; int dx[] = {0, 0, -1, 1}; int dy[] = {1, -1, 0, 0}; void init(){ memset(atlas, 0, sizeof(atlas)); for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ scanf("%d", &atlas[i][j]); } } res = 0; } //搜索周围比他大的就可以了 void bfs(int a, int b){ memset(vis, false, sizeof(vis)); vis[a][b] = true; queue
que; vector > vec; long long tmp = 0; int high = atlas[a][b]; int mini = inf; vec.push_back(make_pair(a, b)); que.push(make_pair(a, b)); while (!que.empty()){ P p = que.front(); que.pop(); for (int i = 0; i < 4; i++){ int x = p.first + dx[i]; int y = p.second + dy[i]; if (x < 0 || x >= n || y < 0 || y >= m) continue; if (atlas[x][y] <= high && (x == 0 || x == n - 1 || y == 0 || y == m - 1)){ return ; } if (atlas[x][y] > high){ mini = min(mini, atlas[x][y]); continue; } if (vis[x][y] == true) continue; vis[x][y] = true; vec.push_back(make_pair(x, y)); que.push(make_pair(x, y)); } } if (mini == inf) return ; for (int i = 0; i < vec.size(); i++){ int x = vec[i].first; int y = vec[i].second; res += mini - atlas[x][y]; atlas[x][y] = mini; } } void solve(){ for (int i = 1; i < n - 1; i++){ for (int j = 1; j < m - 1; j++){ bfs(i, j); } } /*printf("check\n"); for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ printf("%d ", atlas[i][j]); } printf("\n"); }*/ cout << res << endl; } int main(){ while (scanf("%d%d", &n, &m) == 2){ init(); solve(); } return 0; }