题目不再赘述
打卡题,可以宽搜也可以深搜
这里我使用深搜,第一次搜岛屿数量,第二次搜沉没岛屿数量;
剪枝:若搜到一个核心岛屿即可不用搜。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1110;
char map[N][N];
int n;
bool st[N][N];
bool st1[N][N];
int nums = 0;
int or_nums;
int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};
bool check(int x,int y)
{
for(int i = 0;i < 4;i ++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < n)
{
if(map[xx][yy] == '.')return true;
}
}
return false;
}
void dfs1(int x,int y)
{
if(st1[x][y])return;
st1[x][y] = true;
for(int i = 0;i < 4;i ++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < n && map[xx][yy] == '#' && !st1[xx][yy])
{
dfs1(xx,yy);
}
}
}
void dfs2(int x,int y,int k,int bound_nums,int& flag)
{
if(st[x][y])return;
//if(flag == 1)return;
st[x][y] = true;
for(int i = 0;i < 4;i ++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if(xx >= 0 && xx < n && yy >= 0 && yy < n && map[xx][yy] == '#' && !st[xx][yy])
{
if(flag == 1){
dfs2(xx,yy,k,bound_nums,flag);
};
k ++;
if(check(xx,yy)){
bound_nums ++;
// printf("%d,%d is bound_part,bound_nums is %d\n",xx,yy,bound_nums);
}
else{
flag = 1;
// printf("%d,%d is not bound_part,bound_nums is %d\n",xx,yy,bound_nums);
}
// else if(map[xx][yy]=='.')continue;
dfs2(xx,yy,k,bound_nums,flag);
}
}
}
int main()
{
cin >> n;
for(int i = 0;i < n;i ++)
cin >> map[i];
for(int i = 0;i < n;i ++)
{
for(int j = 0;j < n;j ++)
{
if(map[i][j] == '#' && st1[i][j] == false)
{
dfs1(i,j);
or_nums ++;
}
}
}
// printf("or_num is %d\n",or_nums);
for(int i = 0;i < n;i ++)
{
for(int j = 0;j < n;j ++)
{
if(map[i][j] == '#' && st[i][j] == false){
int flag = 0;
dfs2(i,j,0,0,flag);
if(flag == 1)nums ++;
}
}
}
/* for(int i = 0;i < n;i ++)
{
cout << map[i] << endl;
}*/
//printf("nums is %d\n",nums);
cout << or_nums - nums << endl;
/* for(int i = 0;i < n;i ++)
{
}*/
}
/*
9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........
.......
.##....
.##....
....##.
..####.
...###.
.......
*/