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;
}