1365: [蓝桥杯2018初赛]全球变暖 非DFS

1365: [蓝桥杯2018初赛]全球变暖
时间限制: 1 Sec 内存限制: 256 MB
提交: 2071 解决: 500
[状态] [提交] [命题人:外部导入]

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

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

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:




…#…


请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
输出
一个整数表示答案。
样例输入 Copy
7

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

样例输出 Copy
1

**

注意,这个贴子只给出了非DFS的方法,想要了解DFS的通解等下次更新。 这种题一般确实用搜索去做,不过要认识到,搜索只是一种通法,并不一定是最优解。但是所有能用搜索写的题,每个题的优化解法基本都不一样。

**

思路如下
图中就只有两种状态,要不陆地要不海洋,并且陆地只会变成海洋,不可逆回

那么,可以把陆地给标记为一,值为一的才是陆地,然后有海洋的话,四方都减去一,这样,就能符合题意。

那么接下来就是遍历地图
优化一下遍历方案,首先,最外圈一定是海洋,那就不计算内一层。从内一层开始从头到尾遍历,只要是海洋,就把四个方向的值都减一。

如是而般,就可以快速模拟出来

1 输入时,海洋的坐标值为0,陆地为1

for(int i = n; i<n; i++){
    
    
	for(int j = n; j<n; j++){
    
    
		cin >> a;
		if(a == '.'){
    
    
			a[i][j] = 0;
		}else a[i][j] = 1;
	}
}

2 模拟出来关键步骤

if(a[i][j] < 1){
    
    
	a[i-1][j]--; 
	a[i+1][j]--; 
	a[i][j+1]--; 
	a[i][j-1]--; 
}

3 把以上合起来,输入即计算

for(int i = n; i<n; i++){
    
    
	for(int j = n; j<n; j++){
    
    
		cin >> a;
		if(a == '.'){
    
    
			a[i-1][j]--; 
			a[i+1][j]--; 
			a[i][j+1]--; 
			a[i][j-1]--; 
		}else if(a[i][j] == 0) a[i][j] ++;
	}
}

4 最后全部遍历一下,计算出有陆地的数量

for(int i = n; i<n; i++){
    
    
	for(int j = n; j<n; j++){
    
    
			if(a[i][j] = 1) ans++;
	}
}
cout << ans;
return 0;

Guess you like

Origin blog.csdn.net/weixin_52559308/article/details/115304786
dfs