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

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


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值