蓝桥杯-全球变暖(了遗憾)

你有一张某海域NxN像素的照片,“。”表示海洋,“#”表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。  
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。  
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。  
【输入格式】
第一行包含一个整数N.(1 <= N <= 1000)  
以下N行N列代表一张海域照片。  
照片保证第1行,第1列,第N行,第N列的像素都是海洋。  
【输出格式】
一个整数表示答案。
【输入样例】

.......
.##....
.##....
....##.
..####.
...###.
.......  
【输出样例】
1  
资源约定:
峰值内存消耗(含虚拟机)<256M
CPU消耗<1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。
注意:
主函数需要返回0;
只使用ANSI C / ANSI C ++标准;
。调用不要依赖于编译环境或操作系统的特殊函数
所有依赖的函数必须明确地在源文件中的#include <XXX>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

思路:几个月前,比现在还菜的小白我,带着希望带着膨胀参加了蓝桥杯省赛,当时做全球变暖这道题时思路非常清晰也知道用搜索写,2次DFS岛数,得出二者的差值输出。虽然现在看来这个方法并不是多么好,但当时连样例都过不了实在是气死人,熟练度太低,一大遗憾,现在回头照着比赛时的思路写了一次,一气呵成,没找到可提交该题的平台,自己测了几组数据,应该没问题。算是了了一个遗憾。

代码如下:

#include<iostream>
#include<stdio.h>
using namespace std;
char p[1005][1005];
int n,m,f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int k)
{
	for(int i=0;i<4;i++)
	{
		int x1=x+f[i][0];
		int y1=y+f[i][1];
		if(x1>=0&&x1<n&&y1>=0&&y1<n&&p[x1][y1]=='#'&&k==1)
		{
			p[x1][y1]='@';
			dfs(x1,y1,1);
		}
		if(x1>=0&&x1<n&&y1>=0&&y1<n&&p[x1][y1]=='@'&&k==2)
		{
			dfs(x1,y1,2);
		}
	}
}
int fun(int k)
{
	int s=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if((p[i][j]=='#'&&k==1)||(p[i][j]=='@'&&k==2))
			{
				dfs(i,j,k);
				s++;
			}
		}
	}
	return s;
}
int main()
{
	int i,j,s1,s2;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{   
	    getchar();
		for(j=0;j<n;j++)
		{
			scanf("%c",&p[i][j]);
		}
	}
	s1=fun(1);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(p[i][j]=='@'&&(p[i-1][j]=='.'||p[i+1][j]=='.'||p[i][j+1]=='.'||p[i][j-1]=='.'))
			{
				p[i][j]='!';
			}
		}
	}
	s2=fun(2);
	printf("%d\n",s1-s2);
	return 0;
}

希望下次蓝桥杯不要再让自己失望。

猜你喜欢

转载自blog.csdn.net/pleasantly1/article/details/81087375