题目链接:
E - Emptying the Baltic
题目大意:n*m的地图, 每个格子有一个海拔高度, 当海拔<0的时候有水。 现在在(x, y)最深处放一个抽水机, 问最多能抽多少水,周围8个方向的水会流过来。
具体思路:对于每一个海拔小于0的点,判断这个点周围有水的最低高度。然后将这些高度加起来就可以了。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 500+100; 6 int n,m; 7 int a[maxn][maxn]; 8 int vis[maxn][maxn]; 9 int f[2][8]= {{1,-1,0,0,1,-1,1,-1}, 10 {0,0,1,-1,-1,1,1,-1} 11 }; 12 struct node 13 { 14 int x,y,dep; 15 node() {} 16 node(int xx,int yy,int zz) 17 { 18 x=xx; 19 y=yy; 20 dep=zz; 21 } 22 bool friend operator < (node t1,node t2) 23 { 24 return t1.dep>t2.dep; 25 } 26 }; 27 bool judge(int x,int y) 28 { 29 if(x>=1&&x<=n&&y>=1&&y<=m) 30 return true; 31 return false; 32 } 33 ll spfa(int x,int y) 34 { 35 priority_queue<node>q; 36 q.push(node(x,y,a[x][y])); 37 vis[x][y]=1; 38 ll ans=fabs(a[x][y]); 39 while(!q.empty()) 40 { 41 node top=q.top(); 42 q.pop(); 43 for(int i=0; i<8; i++) 44 { 45 int tx=top.x+f[0][i]; 46 int ty=top.y+f[1][i]; 47 if(judge(tx,ty)&&vis[tx][ty]==0&&a[tx][ty]<0) 48 { 49 vis[tx][ty]=1; 50 int tmp=max(a[tx][ty],top.dep); 51 ans+=(-tmp); 52 q.push(node(tx,ty,tmp)); 53 } 54 } 55 } 56 return ans; 57 } 58 int main() 59 { 60 scanf("%d %d",&n,&m); 61 for(int i=1; i<=n; i++) 62 { 63 for(int j=1; j<=m; j++) 64 { 65 scanf("%d",&a[i][j]); 66 } 67 } 68 int x,y; 69 scanf("%d %d",&x,&y); 70 ll ans=spfa(x,y); 71 printf("%lld ",ans); 72 return 0; 73 }