首页 > 其他分享 >bfs与dfs ,全球变暖——蓝桥problems178

bfs与dfs ,全球变暖——蓝桥problems178

时间:2024-09-14 17:13:05浏览次数:11  
标签:bfs nx int dfs 蓝桥 ny mp &&

问题描述:
.......

.##....

.##....

....##.

..####.

...###.

.......
有一张还以N*N的像素照片,“.”表示海洋,“#”表示陆地,其中上下左右能连在一起的陆地称作岛屿,例如上图有两座岛屿,由于全球气候变暖,靠经海洋的陆地会被淹没,问图中有多少座岛屿会被完全淹没
.......

.......

.......

.......

....#..

.......

.......

输入:
第一行输入一个整数N,之后的N*N输入该像素照片,保证第一行第一列最后一行最后一列都为海洋。
输出:
输出一个整数表示答案

问题分析:
要找到所有的岛屿,如果该岛屿存在高地则该岛屿不会被淹没,即存在一片陆地其周围都是陆地的岛屿,可以使用DFS,BFS进行搜索,由于每个像素点都需要搜索,一共有N*N个点那么时间复杂度为O(N**2),好像不可能再优了

DFS代码:

#include<iostream>
using namespace std;

const int N = 1010;
char mp[N][N];
int vis[N][N] = { 0 };
int d[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int flag;
void dfs(int x, int y) {
	vis[x][y] = 1;    //标记为该节点已经查过,与下面的dfs(nx, ny);搭配

	//条件
	if (mp[x][y - 1] == '#' && mp[x][y + 1] == '#' && mp[x - 1][y] == '#' && mp[x + 1][y] == '#') {
		flag = 1;  //flag=1代表有高地,该岛屿不会被淹没
	}

	//搜索四个周围方向
	for (int i = 0; i < 4; i++) {
		int nx = x + d[i][1]; int ny = y + d[i][2];
		if (vis[nx][ny] == '0' && mp[nx][ny] == '# ') {  //注意这个判断语句两个条件的先后,这里其实是在岛屿内搜索了,需要把所有的陆地都标记
			dfs(nx, ny);
		}
	}
}

int main() {
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> mp[i];
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (mp[i][j] == '#' && vis[i][j] == 0) {  //这个是整图搜索,所以是这样的条件先后
				flag = 0;
				dfs(i, j);
				if (flag == 0) {
					ans++;
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}

bfs代码:

#include<iostream>
#include <queue>
using namespace std;

const int N = 1010;
char mp[N][N];
int vis[N][N];
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int flag;
void bfs(int x, int y) {
	queue < pair<int, int>>q;
	q.push({ x, y });
	vis[x][y] = 1;
	//dfs可以利用递归实现查询,而bfs需要利用循环
	while (q.size()) {
		pair<int, int>t = q.front();
		q.pop();  //需要将队首删除
		int tx = t.first; int ty = t.second;
		if (mp[tx][ty - 1] == '#' && mp[tx][ty - 1] == '#' && mp[tx - 1][ty] == '#' && mp[tx + 1][ty] == '#') {
			flag = 1;
		}
		for (int i = 0; i < 4; i++) {
			//上下左右四个方向依次进队
			int nx = tx + dir[i][1]; int ny = ty + dir[i][2];
			if (vis[nx][ny] == 0 && mp[nx][ny] == '#') {
				vis[nx][ny] == 1;  //这里和dfs不同,记得标记
				q.push({ nx,ny });
			}
		}
	}
}

int main() {
	int n; cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> mp[n];
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (mp[i][j] == '#' && vis[i][j] == 0) {
				flag = 0;
				bfs(i, j);
				if (flag == 0) {
					ans++;
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}

由此可见,dfs实际上就是递归,而bfs就是循环,相比之下好像bfs更好理解,哈哈

标签:bfs,nx,int,dfs,蓝桥,ny,mp,&&
From: https://www.cnblogs.com/oQAQo/p/18412932

相关文章

  • Hadoop(十)HDFS API操作
    API操作Shell操作是在集群内部,即hadoop102上进行操作,API操作是希望在Windows上能远程连接集群实现增删改查操作一、客户端环境准备1、找到资料包路径下的Windows依赖文件夹,拷贝hadoop-3.1.0到非中文路径2、在Windows上配置HADOOP_HOME环境变量3、配置Path环境变量4、验证H......
  • Hadoop(九)HDFS Shell操作
    Shell操作一、基本语法hadoopfs具体命令hdfsdfs具体命令二、命令大全[user@hadoop102~]$hadoopfsUsage:hadoopfs[genericoptions] [-appendToFile<localsrc>...<dst>] [-cat[-ignoreCrc]<src>...] [-checksum<src>...] [-chgrp[-R]GROUPP......
  • dfs深度优先搜索
    面试题04.01.节点间通路-力扣(LeetCode)classSolution{public:booldfs(unordered_map<int,vector<int>>&adjList,vector<bool>&visited,intcurrent,inttarget){if(current==target){returntrue;}......
  • 蓝桥杯【物联网】零基础到国奖之路:六. 中断
    蓝桥杯【物联网】零基础到国奖之路:六.中断第一节中断理论1,中断的作用2,中断和异常3,NVIC中断控制器4,中断的分类5,中断管理机制第二节GPIO中断1,CubeMX配置2,添加中断代码第一节中断理论举个例子:工作时电话响了,这时你会把手里的工作停下来,然后接电话,电话里的人安排你......
  • fastDFS - 单机部署 + nginx
    准备查看操作系统的版本信息[root@lab10~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)查看操作系统的网卡地址[root@lab10~]#ipaddressshowens322:ens32:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPgroupdef......
  • nginx 添加 ngx_fastdfs_module 模块
    目录nginx添加ngx_fastdfs_module模块背景安装fastdfslibcommon组件安装libserverframe组件安装fastdfs源码编译安装nginx重新源码编译下载ngx_fastdfs_module模块下载nginx源码包替换nginx添加ngx_fastdfs_module模块背景我在机器上源码安装了一个nginx,然后用户又让......
  • HDFS批量清理过期文件
    #!/bin/bashsource~/.bashrc#HADOOP所在的bin目录HADOOP_BIN_PATH=/opt/cloudera/parcels/CDH/bin#待检测的HDFS目录d1=/tmp1d2=/tmp/sac-sac1d3=/tmp/cep-bu4d4=/tmp/test_data_standardd5=/tmp/test_data_standard_sac#将待检测的目录(可以为多个)加载至数组中......
  • spoon、mysql数据导入hive,分别使用hdfs导入,或者修改配置
    一、mysql通过hdfs导入到hive—spoon    首先要在要在主对象树里边ADD一个hadoop然后在文件安装位置找到这个next后会出现这个,然后就可以把这页面关闭然后新建项目选择这两个,如果没有选择选项,重启软件就会有了然后选择这几个文件从服务器hadoopetc的配置文......
  • c++求助bfs流星雨题目为什么代码编不过
    题目链接3669--MeteorShower(poj.org)英文题目DescriptionBessiehearsthatanextraordinarymeteorshoweriscoming;reportssaythatthesemeteorswillcrashintoearthanddestroyanythingtheyhit.Anxiousforhersafety,shevowstofindherwayt......
  • dfs.support.append
    ‌查询ApacheHadoop官网文档的方法‌:‌1.‌访问Hadoop官网‌:‌首先,‌打开浏览器,‌输入网址https://hadoop.apache.org并访问ApacheHadoop的官方网站。‌2.‌定位文档区域‌:‌在官网首页,‌找到并点击“Documentation”链接(‌或在页面底部寻找“Releasearchive”选项)‌。‌3.......