1428. B Baby Climber(心宝去爬山)

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

心宝热爱运动,喜欢爬山。一天他去道场山游玩。杭嘉湖平原多丘陵,心宝手上有一幅地图,是分层设色地形图(地图为长宽均不超过50的矩阵),心宝想算算地图上有多少个山顶他需要翻越。
为了方便,地图上地势高度用小写字母'a' - 'z'表示,序号越靠前的字母表示地势越高。山顶的定义是指其东南西北四个相邻地点都没有更高的地势存在即为山顶,若有相邻的一片等高地势,则算做一个山顶,例如一幅地图如下表示:
ccccc
cbbbc
cbabc
cbbbc
ccccc
则显然的,地图中a点为山顶。整张地图只有一个山顶,而
cbbcbabc
cbbcbabc
cbbcbabc
cbbcbabc
显然图中有两条山脉分别是左边的b和右边的a,所以算两个山顶。

请你计算一下,心宝所给的地图中有几个山顶

Input

输入输出包括多个Case。 每个Case包含多行,每一行包含相等数量的小写字母,表示地图的每一行内容。 每个Case以*****表示结束。 数据间没有多余的空格和空行。 输入保证每个Case最多不超过50行,每行不超过50个字符。

Output

每个Case一行输出山顶数目

Sample Input

ccccc
cbbbc
cbabc
cbbbc
ccccc
*****
cbbcbabc
cbbcbabc
cbbcbabc
cbbcbabc
*****

Sample Output

1
2

Problem Source

<Good Luck, Sysu Teams>,Renaissance

// Problem#: 1428
// Submission#: 2196979
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char map[51][51];
int d[][2]={0,1,0,-1,1,0,-1,0};
struct node{
  char c;
  int x,y;
  friend bool operator<(const node& a,const node& b){
    return a.c>b.c;
  }
};

int main(){
 
  while (gets(map[0]))
  {
    int n=1,i,j,m=strlen(map[0]);
    std::priority_queue<node> qu;
    node u,v;
    while (gets(map[n]) && map[n][0]!='*') 
      n++;
    for (i=0; i<n; ++i) for (j=0; j<m; ++j)
    {
      u.c=map[i][j];
      u.x=i; u.y=j;
      qu.push(u);
    }
    int ans=0;
    while (!qu.empty())
    {
      u=qu.top(); 
      qu.pop();
      if (!map[u.x][u.y]) 
        continue;
      ans++;
      std::queue<node> q;
      q.push(u);
      while (!q.empty())
      {
        u=q.front(); 
        q.pop();
        for (i=0; i<4; ++i)
        {
          v.x=u.x+d[i][0];
          v.y=u.y+d[i][1];
          if (v.x<0 || v.x>=n || v.y<0 || v.y>=m) 
            continue;
          if (map[v.x][v.y] && map[v.x][v.y]>=u.c)
          {
            v.c=map[v.x][v.y];
            map[v.x][v.y]=0;
            q.push(v);
          }
        }
      }
    }//用了2个队列,一个优先队列和一个队列
    printf("%d\n",ans);
  }
  return 0;
}                                 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值