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#: 3307404
// 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
// Problem#: 1428
// Submission#: 3307337
// 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 <vector>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <string>
#include <queue>
using namespace std;
const int MAX_G = 55;
char G[MAX_G][MAX_G];
int firstLine;
int H, W;
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
vector<pair<int, int> > same;
bool vis[MAX_G][MAX_G];
bool isValid(int ni, int nj, int pi, int pj) {
return (0 <= ni && ni < H) && (0 <= nj && nj < W) && !vis[ni][nj] && (G[ni][nj] == G[pi][pj]);
}
void dfs(int pi, int pj) {
for (int i = 0; i < 4; i++) {
int ni = pi + dir[i][0];
int nj = pj + dir[i][1];
if (isValid(ni, nj, pi, pj)) { // if they are same
same.push_back(make_pair(ni, nj));
vis[ni][nj] = true;
dfs(ni, nj);
}
}
}
int check() {
for (int i = 0; i < same.size(); i++) {
for (int j = 0; j < 4; j++) {
if ((0 <= same[i].first + dir[j][0] && same[i].first + dir[j][0] < H && 0 <= same[i].second + dir[j][1] && same[i].second + dir[j][1] < W) && (G[same[i].first + dir[j][0]][same[i].second + dir[j][1]] < G[same[i].first][same[i].second])) return 0;
}
}
return 1;
}
void solve() {
H = firstLine - 1;
W = strlen(G[0]);
int ans = 0;
memset(vis, false, sizeof(vis));
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (!vis[i][j]) {
vis[i][j] = true;
same.push_back(make_pair(i, j));
dfs(i, j);
ans += check();
same.clear();
}
}
}
cout << ans << endl;
}
int main() {
std::cout.sync_with_stdio(false);
firstLine = 0;
while (1) {
cin >> G[firstLine++];
if (cin.eof()) {
solve();
break;
}
if (G[firstLine - 1][0] == '*') {
solve();
firstLine = 0;
}
}
return 0;
}