首页 > 其他分享 >lanqiao OJ 3513 岛屿个数(2023省赛)

lanqiao OJ 3513 岛屿个数(2023省赛)

时间:2024-04-05 11:29:16浏览次数:18  
标签:node OJ tx ty 3513 岛屿 int mp 2023

原题链接:3.岛屿个数 - 蓝桥云课 (lanqiao.cn)

感觉这个题出的真的特别好,考察了对bfs的使用,包括连通性的一系列判断,如果对bfs掌握的不熟练真的很难想出如何下手来做这道题。

这里我们需要用海水来进行bfs,海水可以渗透,也就是说可以走8个方向,因为我们要从任意一个边界点出发,所以我们需要把图扩展一下,变成n+2,m+2的图,我们把第0行第0列,和n+1行,n+1列变成0,也就是海水,这样的话我们从0,0开始遍历,就可以从每一个边界点进入判断,当然,我们的越界条件也要变成 n+2 , 和 m+2(这里真的很重要www , 博主刚开始做这道题,因为没有判别好边界问题导致直接全wa,要是这是在考场上这样,不得直接寄了,本来就不会几道),然后当我们第一次搜到一个岛屿的时候,他的初始状态是1,也就是说我们还没有搜索到过这个岛屿,这样的话我们就把最终答案 ans ++ ,然后对这个岛屿进行染色,染色当然很简单,就是一个判定连通性的问题,把这个1联通的所有1都变成2 ,这样就表示我们已经搜过这个岛屿了,如果这个岛屿内部也有岛屿,而且外面这个岛屿是封闭的我们的外界海水就渗透不进去,那我们就不会搜索到子岛屿,子岛屿也就不会参与计数;

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>

using namespace std ;
const int N = 100 ;
int d1[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
int d2[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,1},{1,-1},{-1,-1}} ;
struct node{//这是我们记录搜索到的点的坐标
	int x , y;
	node(int xx ,int yy){
		x = xx , y = yy ;
	}
	bool operator < (const node & o) const {
		if(x == o.x) return y < o.y ;
		else return x < o.x ;
	}
};
queue<node> q ;//用于bfs
char mp[N][N] ;//存图
int n , m ;
int ans ;//返回值
void dfs(int x, int y){//染色,判断岛屿的上下左右四个方向,如果有陆地的话,索命他们是联通的,就对他们进行染色
	mp[x][y] = '2' ;
	for(int i = 0 ; i < 4 ; i ++){
		int tx = x + d1[i][0] , ty = y + d1[i][1] ;
		if(mp[tx][ty] == '1'){
			dfs(tx,ty) ;
		}
		
	}
}

void bfs1(){
	q.push(node(0,0)) ;
	while(!q.empty()){
		node now = q.front() ;
		q.pop() ;
		int x = now.x , y = now.y ;
		for(int i = 0 ; i < 8 ; i ++){
			int tx = x + d2[i][0] , ty = y + d2[i][1] ;
			if(tx<0||tx>n+1||ty<0||ty>m+1||mp[tx][ty] == '2') continue ;//越界或者已经搜索过了
			if(mp[tx][ty] == '1'){
				ans ++ ; dfs(tx,ty) ;//如果碰到新的陆地就进行染色
			}
			if(mp[tx][ty] == '0'){//如果是海水,就进入队列让下一个海水继续渗透
				mp[tx][ty] = '2' ; 
				q.push(node(tx,ty)) ;
			}
		}
	}	
}

int main(){
	int t ; cin >> t ;
	while(t --){
		ans = 0 ;
		memset(mp,'0',sizeof(mp));
		cin >> n >> m ;
		for(int i = 0 ; i <= n ; i++) mp[i][0] = '0' ;//对边界进行初始化,保证从所有边界点的海水进行渗透
		for(int j = 0 ; j <= m ; j++) mp[0][j] = '0' ;
		for(int i = 1 ; i <= n ; i ++){
			for(int j = 1 ; j <= m ; j ++){
				cin >> mp[i][j] ;
			}
		}
		bfs1() ;
		cout << ans << endl ;
	}
	
}

标签:node,OJ,tx,ty,3513,岛屿,int,mp,2023
From: https://blog.csdn.net/m0_74187051/article/details/137396582

相关文章

  • P9870 [NOIP2023] 双序列拓展 题解
    题意:称某个序列\(B=\{b_1,b_2,\cdots,b_n\}\)是另一个序列\(A=\{a_1,a_2,\cdots,a_m\}\)的拓展当且仅当存在正整数序列\(L=\{l_1,l_2,\cdots,l_m\}\),将\(a_i\)替换为\(l_i\)个\(a_i\)后得到序列\(B\)。例如,\(\{1,3,3,3,2,2,2\}\)是\(\{1,3,3,2\}\)的拓展,......
  • 挑战程序设计竞赛 2.6章习题 POJ 1930 Dead Fraction
    https://vjudge.csgrandeur.cn/problem/POJ-1930迈克在最后一刻拼命地赶着完成他的论文。在接下来的3天里,他需要将所有的研究笔记整理成较为连贯的形式。不幸的是,他注意到他在计算方面非常粗心。每当他需要进行算术运算时,他只是将其输入计算器,并将他认为相关的答案写下来。每当......
  • UOJ #514. 【UR #19】通用测评号
    Description有\(n\)个管道,每个管道的最大大小为\(a\),每次等概率随机选一个没满的管道里放一个石子,当所有管道的大小都\(\geqb\)时停止,问装满的管道的期望个数,与\(998244353\)取模。\(1\len\le250,1\leb<a\le250\)。Solution先考虑一个引理:有\(n\)个集合,有......
  • [CVPR2023]Detecting and Grounding Multi-Modal Media Manipulation-DGM4
    DGM4人造DeepFake数据——Multi-ModalMediaManipulationDataset再造数据集的意义此前的其他相关数据集要么是单模态的Fake图片篡改:文本篡改要么是多模态小规模数据human-generated:outofcontextpairs:并且都是二分类问题(单纯分类为“是否”为fake数据)DGM......
  • 【小迪安全2023】第9天:信息打点-CDN绕过篇&漏洞回链&接口探针&全网扫描&反向邮件;第10
    ......
  • 关于共享 OJ 计划
    写在前面原文章在这里。我们是\(\text{GXOJ}\)的开发组,专注于做“共享\(\text{OJ}\)平台”,欢迎大家前来体验游玩。以下付费功能均可联系\(\text{So_noSlack}\)咨询。免费功能对于所有中国公民:可自由注册\(\text{GXOJ}\)账户,但不可恶意注册,否则将被封禁账号或\(\te......
  • 爱在冰川语录精华-2023
    12月【所有让你亏的操作你不要再做,那你不就赚钱了吗】【强制与龙头发生关系,还有做自己看得懂的交易】【冰点回暖博弈高标】【集合竞价一笔,开盘一笔,这个手法是标准的____的手法】【炒股就是把一个一个条件累加起来,来提升自己的胜率】传统的过节博弈手法有哪些?1:近阶段活跃板......
  • 2023.4 做题记录
    2023.4做题记录[NOIP2018提高组]旅行看到题目中要求\(m=n\)或\(m=n-1\),此时就应当分类讨论。①当\(m=n-1\)时:此时数据为一颗树。我们贪心的想:起始点为\(1\)的时候显然最优。对于每一个节点,在它子树内按照从小到大的顺序遍历显然最优。复杂度\(O(n\logn)\),瓶颈......
  • BZOJ3160万径人踪灭-回文子序列(位置对称)计数
    link:https://www.luogu.com.cn/problem/P4199写manacher看到的(其实重点并不在manacher)题意:给一个仅包含2种字母的字符串,问有多少种不同的子序列,满足:内容和位置都是对称的不能是连续的一段\(1\leqn\leq10^5\)答案=子序列个数-回文串个数,回文串用manacher跑,子序列则考虑......
  • 华为 2023年4月19日 实习 机试第一题——批量初始化次数
    某部门在开发一个代码分析工具,需要分析模块之间的依赖关系,用来确定模块的初始化顺序,是否有循环依期等问题。“批量初始化”是指一次可以初始化一个或多个模块。例如模块1依赖模块2,模块3也依赖模块2,但模块1和3没有依赖关系,则必须先“批量初始化”模块2,再“批......