首先我看到很多人写博客dfs都是错的所以才发的。
题目链接
首先出在第九题,这个dfs还是很简单的,但是为什么有那么多人dfs会错呢???
最大的原因是他没有判断如果这个岛屿有几块陆地都不会沉的话他就会重复计算,会从原来一个岛屿算成几个岛屿
此为正确代码
#include<iostream>
#include<algorithm>
using namespace std;
char a[1010][1010];
int n;
int dx[]={0,1,-1,0};
int dy[]={1,0,0,-1};
bool b[1000][1000];
void dfs(int x,int y)
{
a[x][y]='*';
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]=='#')
{
dfs(tx,ty);
}
}
}
void deal(int x,int y)
{
if(x==1||x==n||y==1||y==n)
a[x][y]='%';
else
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(a[tx][ty]=='.')
{
a[x][y]='%';
break;
}
}
}
void dfs2(int x,int y)
{
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&(a[tx][ty]=='*'||a[tx][ty]=='%')&&b[tx][ty]==0)//是%也要走目的是把原来这个岛屿图没
{
b[tx][ty]=1;
a[tx][ty]='%';
dfs2(tx,ty);
}
}
}
int main()
{
int sum=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i]+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='#')
dfs(i,j),sum++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='*')
{
deal(i,j);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='*')
{
b[i][j]=1;
dfs2(i,j);//
ans++;
}
}
}
cout<<sum-ans;
}