【题目大意】:给定n*m地图,其中高度不同,问最多能存多少水(和木桶一样,最外层不能存水)。
【解题思路】:每次利用优先队列找出最小的进行扩展。Orz...把它的行列搞反了,看了n久才过的sample~...-_-!!!
【代码】:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <string> #include <cctype> #include <map> #include <iomanip> using namespace std; #define eps 1e-8 #define pi acos(-1.0) #define inf 1<<30 #define pb push_back #define lc(x) (x << 1) #define rc(x) (x << 1 | 1) #define lowbit(x) (x & (-x)) #define ll long long struct Node { ll h; int x,y; Node(){} Node(ll a,int b,int c) { h=a,x=b,y=c; } bool operator <(const Node &a) const { return h>a.h; } }; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int n,m; ll mapp[500][500]; int vis[500][500]; ll ans; bool check(int x, int y) { if (x>0 && x<=n && y>0 && y<=m) return true; return false; } void solve_pq(){ priority_queue<Node> que; memset(vis,0,sizeof(vis)); for (int i=1; i<=m; i++){ que.push(Node(mapp[1][i],1,i)); que.push(Node(mapp[n][i],n,i)); vis[1][i]=1; vis[n][i]=1; } for (int i=2; i<n; i++){ que.push(Node(mapp[i][1],i,1)); que.push(Node(mapp[i][m],i,m)); vis[i][1]=1; vis[i][m]=1; } while(!que.empty()){ Node tmp=que.top(); que.pop(); for (int i=0; i<4; i++){ int tx,ty; tx=tmp.x+dx[i]; ty=tmp.y+dy[i]; if (vis[tx][ty]==0 && check(tx,ty)){ if (mapp[tx][ty]<tmp.h){ ans=ans+tmp.h-mapp[tx][ty]; que.push(Node(tmp.h,tx,ty)); } else que.push(Node(mapp[tx][ty],tx,ty)); vis[tx][ty]=1; } } } return ; } int main() { while (~scanf("%d%d",&m,&n)){ for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) scanf("%lld",&mapp[i][j]); ans=0; solve_pq(); printf("%lld\n", ans); } return 0; }