海平面上升

文章描述了一个程序问题,涉及使用深度优先搜索(DFS)和df函数来确定一张N×N像素的海域照片中,在海平面上升后哪些岛屿会被完全淹没。程序首先标记出可能被淹没的陆地,然后分别计算初始岛屿数量和海平面上升后的岛屿数量,输出消失的岛屿数。
摘要由CSDN通过智能技术生成

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

.......
.##....
.##....
....##.
..####.
...###.
.......

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

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

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

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

输入格式

第一行包含一个整数 N。(1≤N≤1000)。

以下 N 行 N 列代表一张海域照片。

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

输出格式

一个整数表示答案。

输入输出样例

输入 

7 
.......
.##....
.##....
....##.
..####.
...###.
.......  

输出 

1

将会被海水淹没的岛屿用“-”进行标记,不影响后续判断,用ddd数组来记录d数组在df函数中判断岛屿个数,用dfs函数判断海平面上升后的岛屿个数

#include<bits/stdc++.h>
using namespace std;
int n,ans,ans1;
int fx[6]={-1,0,1,0};
int fy[6]={0,1,0,-1};
char d[1010][1010],ddd[1010][1010];
void dfs(int x,int y)
{
	d[x][y] = '.';
	for(int i = 0;i < 4;i++)
        if(d[x + fx[i]][y + fy[i]] != '.' && x + fx[i] > 0 && x + fx[i] <= n && y + fy[i] > 0 && y + fy[i] <= n)
        dfs(x + fx[i],y + fy[i]);
	return;
}
void df(int x,int y){
	ddd[x][y] = '.';
	for(int i = 0;i < 4;i++)
        if(ddd[x + fx[i]][y + fy[i]] == '#' && x + fx[i] > 0 && x + fx[i] <= n && y + fy[i] > 0 && y + fy[i] <= n)
        df(x + fx[i],y + fy[i]);
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= n;j++)
			cin >> d[i][j],ddd[i][j] = d[i][j];
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= n;j++)
			if(d[i][j] == '#' && (d[i - 1][j] == '.' || d[i + 1][j] == '.' || d[i][j - 1] == '.' || d[i][j + 1] == '.'))
                d[i][j] = '-';
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= n;j++)
			if(ddd[i][j] == '#')
			{
				ans1++;
				df(i,j);
			}
	for(int i = 1;i <= n;i++)
		for(int j = 1;j <= n;j++)
			if(d[i][j] == '#')
			{
				ans++;
				dfs(i,j);
			}
	printf("%d",ans1 - ans);
	return 0;
}
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值