肇庆学院"菜鸟杯"程序设计竞赛2019 G.数数有多少个水坑

肇庆学院"菜鸟杯"程序设计竞赛2019 G.数数有多少个水坑

题目描述

有一个由26个小写字母构成的n*m的矩阵(1≤n,m≤1000)。上下左右四连通的区域内有 ‘j’,‘e’,‘s’,‘i’ 这四个小写字母就属于同一个水坑,其余字母则代表地面。 请问该矩阵内有多少个水坑?

输入描述:

多组测试用例,保证 ∑(n*m)≤107;
每组测试第一行输入两个整数,分别为行数n和列数m;
接下来n行每行输入m个字符(字符只包含小写字母)。

输出描述

输出水坑的总个数

示例1

输入

5 8
aajessie
jejeaaaa
aaaaaaaa
jaajeaaa
aaaaaaaa

输出

3

谜之连通块,反正比赛时用BFS一直T,赛后看很多人用DFS,但个人感觉应该差不多,无奈所以还是补了一发,以此警示自己:

#include<bits/stdc++.h>
using namespace std;
 
char s[1005][1005];
int n,m,ans;
 
void dfs(int a,int b){
    if(s[a][b]=='j' || s[a][b]=='e' || s[a][b]=='s'|| s[a][b]=='i') s[a][b]='0';
    else return;
    if(a>0) dfs(a-1,b);
    if(b>0) dfs(a,b-1);
    if(a<n-1) dfs(a+1,b);
    if(b<m-1) dfs(a,b+1);
}
 
int main()
{
  while(~scanf("%d%d",&n,&m)){
    ans=0;
      getchar();
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
           scanf("%c",&s[i][j]);
        }
        getchar();
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
             if(s[i][j]=='j' || s[i][j]=='e' || s[i][j]=='s'|| s[i][j]=='i'){
                dfs(i,j);
                ans++;
             }
        }
    }
    cout<<ans<<endl;
  }
}
发布了235 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/103793180
今日推荐