题目链接:点击打开链接
题意:求该容器最大的容量。使用优先队列,先将最外层的边加入队列,并标记为已遍历过,取出最小的边,遍历它周围的边,如果比它高就直接加入队列,比它小就更新高度和res值后加入队列,当队列为空时res即为最大容量。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int x;
int y;
int h;
friend bool operator<(Node n1,Node n2)
{
return n2.h<n1.h;
}
}node[301][301];
priority_queue<Node>q;
int x[4]={-1,0,1,0},y[4]={0,1,0,-1};
int main()
{
int w,h,i,res,j,a,b,book[301][301];
while(scanf("%d%d",&w,&h)!=EOF)
{
res=0;
memset(book,0,sizeof(book));
for(i=1;i<=h;i++)
for(j=1;j<=w;j++)
{
scanf("%d",&node[i][j].h);
node[i][j].x=i;
node[i][j].y=j;
if(i==1 || i==h || j==1 || j==w) //将最外层的边加入队列
{
q.push(node[i][j]);
book[i][j]=1;
}
}
while(!q.empty())
{
Node p=q.top();
q.pop();
for(i=0;i<4;i++) //遍历周围的边
{
a=p.x+x[i];
b=p.y+y[i];
if(a>=1&&a<=h && b>=1&&b<=w&&book[a][b]!=1)
{
if(node[a][b].h<p.h)
{
res+=p.h-node[a][b].h;
node[a][b].h=p.h;
}
q.push(node[a][b]);
book[a][b]=1;
}
}
}
printf("%d\n",res);
}
return 0;
}