zoukankan      html  css  js  c++  java
  • Ponding Water

    设每个位置的初始高度是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即可。

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

       1: #include <iostream>
       2: #include <cstdio>
       3: #include <queue>
       4: #include <algorithm>
       5: #include <cstring>
       6: using namespace std;
       7: struct node{
       8:     int r,c,h;
       9:     node(){};
      10:     node(int xx, int yy, int hh):r(xx),c(yy),h(hh){}
      11:     bool operator < (const node &s) const
      12:     {
      13:         return h>s.h; // 最小值优先
      14:     }
      15: };
      16: const int maxn = 105;
      17: int row,col;
      18: int a[maxn][maxn],h[maxn][maxn];
      19: bool vis[maxn][maxn];
      20: int dx[] = {0,0,1,-1};
      21: int dy[] = {1,-1,0,0};
      22: priority_queue<node> q;
      23: int sum;
      24: int main()
      25: {
      26:     //freopen("test.txt","r",stdin);
      27:     while(scanf("%d%d",&row,&col) != EOF)
      28:     {
      29:         memset(vis,0,sizeof(vis));
      30:         for(int i=0;i<row;++i)
      31:             for(int j=0;j<col;++j)
      32:                 scanf("%d",&a[i][j]);
      33:         memcpy(h,a,sizeof(a));
      34:         for(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:         }
      41:         for(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:         }
      48:         int tr,tc;
      49:         //sum = 0;
      50:         while(!q.empty())
      51:         {
      52:             node temp = q.top();
      53:             q.pop();
      54:             for(int i=0;i<4;++i)
      55:             {
      56:                 tr = temp.r + dx[i];
      57:                 tc = temp.c + dy[i];
      58:                 if(tr>0 && tr<row-1 && tc >0 && tc < col-1 && !vis[tr][tc])
      59:                 {
      60:                     if(a[tr][tc] < h[temp.r][temp.c])
      61:                         h[tr][tc] = h[temp.r][temp.c];
      62:                     /*{
      63:                         h[tr][tc] = h[temp.r][temp.c];
      64:                         cout<<tr<<' '<<tc<<' '<<a[tr][tc]<<"->"<<h[tr][tc]<<endl;
      65:                     }*/
      66:                     
      67:                     vis[tr][tc] = 1;
      68:                     q.push(node(tr,tc,h[tr][tc]));
      69:                 }
      70:             }
      71:  
      72:         }
      73:         sum = 0;
      74:         //for(int i=0;i<row;++i)
      75:         //{
      76:         //    for(int j=0;j<col;++j)
      77:         //        cout<<a[i][j]<<' ';
      78:         //    cout<<endl;
      79:         //}
      80:         //cout<<endl;
      81:         //for(int i=0;i<row;++i)
      82:         //{
      83:         //    for(int j=0;j<col;++j)
      84:         //        cout<<h[i][j]<<' ';
      85:         //    cout<<endl;
      86:         //}
      87:         for(int i=0;i<row;++i)
      88:             for(int j=0;j<col;++j)
      89:                 sum+=h[i][j] - a[i][j];
      90:         printf("%d\n",sum);
      91:  
      92:  
      93:     }
      94: }
  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/bovine/p/2396065.html
Copyright © 2011-2022 走看看