社区讨论

站外题求条

灌水区参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@m67515aq
此快照首次捕获于
2025/01/22 08:00
去年
此快照最后确认于
2025/11/04 11:05
4 个月前
查看原帖

题目描述

C⽼师名下的资产有⼀座⼩岛。在这座⼩岛上⽣活的家族有⼀个有趣的现象:同⼀个家族的⼈家总是相邻的这⾥的 相邻是指东南⻄北四个⽅向,不同的家族之间总会有河流或是⼭丘隔绝,但同⼀个家族的⼈不⼀定有相同姓⽒。 现在给你岛上的地图,求出岛上有多少个不同的家族。岛上的地图有⾏,每⾏有若⼲列,每个格⼦中要么是空 格,表示⼤海,要么是“*”,表示河流或⼭丘,要么是⼩写字⺟,表示⼀户⼈家的姓⽒

输入

第⼀⾏⼀个整数数字,表示下⾯信息的⾏数。 接下来是⾏字符,每⾏由⼩写字⺟和"*"号组成,有些⾏的最前⾯也可能包含若⼲连续的空格,表示这些区域是⼤ 海,每⼀⾏最多不超过个字符

输出

⼀个数字,表示家族数
对于10%的数据,保证n≤1 对于30%的数据,保证 n≤10 对于100%的数据,保证n≤100且每⼀⾏最多不超过200个字符
CPP
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
string a[105];
int fx[4]={1,-1,0,0},fy[4]={0,0,1,-1};
void dfs(int x,int y) {
	a[x][y]='*';
	for(int i=0;i<4;i++){
		int nx=x+fx[i];
		int ny=y+fy[i];
		if(nx<1||ny<1||nx>n||ny>a[x].size()) continue;
		if(!islower(a[nx][ny])) continue; 
        dfs(nx,ny);
	}

}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=0;i<=n;i++){
		getline(cin,a[i]);
	}
    for(int i=1;i<=n;i++){
		for(int j=1;j<=a[i].size();j++){
			if(islower(a[i][j])){
				dfs(i,j);
				cnt++;
			}
		}
	}
	cout<<cnt;
	return 0;
}
10Pts求条

回复

5 条回复,欢迎继续交流。

正在加载回复...