你有一张某海域NxN像素的照片,“。”表示海洋,“#”表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
【输入格式】
第一行包含一个整数N.(1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行,第1列,第N行,第N列的像素都是海洋。
【输出格式】
一个整数表示答案。
【输入样例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【输出样例】
1
1 #include <iostream> 2 using namespace std; 3 char a[1001][1001];//记录地图 4 int book[1001][1001];//记录是否被走过 5 int n; 6 bool flag; 7 bool check(int x, int y){//检查该点是不是沿海土块 8 //如果该点上下左右都是#说明这个点不是沿海土块 9 if(a[x][y] == '#' && a[x - 1][y] == '#' && a[x + 1][y] == '#' 10 && a[x][y - 1] == '#' && a[x][y + 1] == '#'){ 11 return true; 12 } 13 return false;//如果是沿海土块返回假 14 } 15 void dfs(int x, int y){ 16 int next[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};//四个方向 17 int tx, ty; 18 for(int k = 0; k < 4; k++){ 19 tx = x + next[k][0]; 20 ty = y + next[k][1]; 21 if(tx < 0 || tx >= n || ty < 0 || ty >= n ){//走出地图 22 continue; 23 } 24 if(a[tx][ty] == '#' && book[tx][ty] == 0){ 25 book[tx][ty] = 1;//这里标记不用回溯 26 if(check(tx, ty)){ 27 flag = true;//只要该点不是沿海土块(言外之意是只要有一个土块没被淹没 28 //该岛就不会消失) 29 } 30 dfs(tx, ty); 31 } 32 } 33 } 34 int main(){ 35 int cur = 0;//被淹没岛的起始数; 36 cin >> n; 37 for(int i = 0; i < n; i++){ 38 for(int j = 0; j < n; j++){ 39 cin >> a[i][j]; 40 } 41 } 42 for(int i = 0; i < n; i++){ 43 for(int j = 0; j < n; j++){ 44 if(a[i][j] == '#' && book[i][j] == 0){ 45 flag = false;//每次涂色之前重置flag 46 book[i][j] = 1;//将出发点标记 47 dfs(i,j);//判断该岛是否会被淹没 48 if(!flag) cur++;//如果会被淹没就+1 49 } 50 51 } 52 } 53 cout << cur; 54 return 0; 55 }