设每个位置的初始高度是a[i][j],最终可以达到的高度是h[i][j]。首先,对于最外圈的每个位置,a[i][j] = h[i][j]。然后将最外圈每个位置加入优先队列(高度小的元素在对首),取一个位置t出列,遍历t的相邻位置x,如果a[x]<h[t]。那么a[x]能够达到的最大高度就是h[t],否则h[x] = a[x]。按照这种思路bfs即可。

注意结构体的初始化。可以利用结构体的构造函数,从而减小代码量。

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
namespace std;
struct node{
int r,c,h;
   9:     node(){};
int hh):r(xx),c(yy),h(hh){}
const
  12:     {
// 最小值优先
  14:     }
  15: };
int maxn = 105;
int row,col;
int a[maxn][maxn],h[maxn][maxn];
bool vis[maxn][maxn];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
  22: priority_queue<node> q;
int sum;
int main()
  25: {
,&row,&col) != EOF)
  28:     {
sizeof(vis));
int i=0;i<row;++i)
int j=0;j<col;++j)
,&a[i][j]);
sizeof(a));
int i=0;i<col;++i)
  35:         {
  36:             q.push(node(0,i,a[0][i]));
  37:             vis[0][i] = 1;
  38:             q.push(node(row-1,i,a[row-1][i]));
  39:             vis[row-1][i] = 1;
  40:         }
int i=1;i<row-1;++i)
  42:         {
  43:             q.push(node(i,0,a[i][0]));
  44:             vis[i][0] = 1;
  45:             q.push(node(i,col-1,a[i][col-1]));
  46:             vis[i][col-1] = 1;
  47:         }
int tr,tc;
//sum = 0;
while(!q.empty())
  51:         {
  52:             node temp = q.top();
  53:             q.pop();
int i=0;i<4;++i)
  55:             {
  56:                 tr = temp.r + dx[i];
  57:                 tc = temp.c + dy[i];
if(tr>0 && tr<row-1 && tc >0 && tc < col-1 && !vis[tr][tc])
  59:                 {
if(a[tr][tc] < h[temp.r][temp.c])
  61:                         h[tr][tc] = h[temp.r][temp.c];
/*{
                        h[tr][tc] = h[temp.r][temp.c];
                    }*/
  66:                     
  67:                     vis[tr][tc] = 1;
  68:                     q.push(node(tr,tc,h[tr][tc]));
  69:                 }
  70:             }
  71:  
  72:         }
  73:         sum = 0;
//for(int i=0;i<row;++i)
//{
//    for(int j=0;j<col;++j)
//        cout<<a[i][j]<<' ';
//    cout<<endl;
//}
//cout<<endl;
//for(int i=0;i<row;++i)
//{
//    for(int j=0;j<col;++j)
//        cout<<h[i][j]<<' ';
//    cout<<endl;
//}
int i=0;i<row;++i)
int j=0;j<col;++j)
  89:                 sum+=h[i][j] - a[i][j];
,sum);
  91:  
  92:  
  93:     }
  94: }

相关文章: