dfs入门题
看有几块W水池,一开始不理解题意,就是w周围8个方向如果还有w那和原本的w算一块水池
原题链接http://poj.org/problem?id=2386
ac代码
#include<stdio.h>
char a[105][105];
int n,m;
int ans;
void dfs(int x,int y)
{
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
int tx=x+dx;
int ty=y+dy;
if(a[tx][ty]=='W')
{
a[tx][ty]='.';
dfs(tx,ty);//递归
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
}
ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]=='W')
{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
顺便带一个只有上下左右方向搜索的
ac代码
#include<stdio.h>
int a[105][105];
int n,m;
int ans;
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0}; //区别就在这
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(a[tx][ty]==1)
{
a[tx][ty]=0;
dfs(tx,ty);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]==1)
{
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}