全球变暖(dfs)

全球变暖

你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:
........##.....##........##...####....###........

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:
在这里插入图片描述

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。

照片保证第1行、第1列、第N行、第N列的像素都是海洋。

【输出格式】
一个整数表示答案。

【输入样例】
7

.##…
.##…
…##.
…####.
…###.

【输出样例】
1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

思路:找的是被完全淹没的联通块,那么只要联通中存在一个‘#’周围都是‘#’,这个联通块就不会被完全淹没,找出不会被完全淹没的联通块的数量,最后用总数量减去它,就是答案。

#include<iostream>
using namespace std;
#define N 1005
char mp[N][N];
int vis[N][N];
int nex[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int flag,n,ans=0;
void dfs(int x,int y)
{
	vis[x][y]=1;
	if(x+1>=0 && x+1<n && x-1>=0 && x-1<n && y+1>=0 && y+1<n && y-1>=0 && y-1<n)  //防止超边界
	{
		if(mp[x+1][y]=='#' && mp[x-1][y]=='#' && mp[x][y+1]=='#' && mp[x][y-1]=='#') /*如果存在不会被淹没的点,进行标记*/
			flag=1;
	}
	for(int i=0;i<4;i++)
	{
		int xx=x+nex[i][0];
		int yy=y+nex[i][1];
		if(xx<0 || xx>=n || yy<0 || yy>=n || mp[xx][yy]!='#' || vis[xx][yy])
			continue;
		dfs(xx,yy);
	}
}
int main()
{
	scanf("%d",&n);
	ans=0;
	int num=0;
	for(int i=0;i<n;i++)
		scanf("%s",&mp[i]);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		{
			if(mp[i][j]=='#' && !vis[i][j])
			{
				num++;
				flag=0;
				dfs(i,j);
				if(flag)
					ans++;
			}
		}
	cout<<num-ans;
	return 0;
}
尽管提供的引用[^1]与HBase相关,而当前问题是关于全球变暖问题的C++ DFS算法实现或解决方案,这两者之间并无直接关联。然而,可以基于DFS算法设计一种解决全球变暖问题的方法。 以下是针对全球变暖问题的一个假设场景下的DFS实现方案: ### 假设情景 考虑一个城市网络图模型,在该模型中,节点表示不同区域的城市,边则代表这些城市之间的交通连接情况。某些城市的工业排放量较高,从而加剧了全球变暖现象。通过DFS遍历整个城市网络图,找到所有高污染源并标记它们以便采取措施减少碳排放。 #### C++ 实现 ```cpp #include <iostream> #include <vector> using namespace std; // 定义最大污染阈值 const int POLLUTION_THRESHOLD = 50; void dfs(int node, vector<vector<int>>& adjacencyList, vector<bool>& visited, const vector<int>& pollutionLevels) { // 如果已经访问过,则跳过 if (visited[node]) return; // 标记为已访问 visited[node] = true; // 判断当前节点是否超过污染阈值 if (pollutionLevels[node] >= POLLUTION_THRESHOLD) { cout << "High Pollution Detected at City: " << node << endl; } // 遍历相邻节点 for(auto neighbor : adjacencyList[node]){ if(!visited[neighbor]){ dfs(neighbor, adjacencyList, visited, pollutionLevels); } } } int main(){ // 创建邻接表表示城市间的连接关系 int nCities = 6; // 总共有六个城市作为例子 vector<vector<int>> adjacencyList(nCities); // 添加一些假定的边到邻接表里 adjacencyList[0].push_back(1); adjacencyList[0].push_back(2); adjacencyList[1].push_back(3); adjacencyList[1].push_back(4); adjacencyList[2].push_back(5); // 初始化各城市的污染水平数据 vector<int> pollutionLevels = {70, 80, 90, 10, 20, 30}; // 各个城市对应的污染指数 // 记录哪些城市已经被访问过了 vector<bool> visited(nCities, false); // 对每一个未被访问过的城市执行dfs搜索 for(int i=0;i<nCities;i++){ if(!visited[i]){ dfs(i, adjacencyList, visited, pollutionLevels); } } return 0; } ``` 上述代码展示了如何利用深度优先搜索来识别具有高水平污染物的城市节点。此方法可以帮助政府机构快速定位主要污染源头,并制定相应的减排政策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值