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;