题目:【POJ】2386 ————Lake Counting
原题连接:http://poj.org/problem?id=2386
题目大意:给出一个由水(w)和干土(.)组成的图,水的八的个方向可以连成水池(一个水也可以为一个水池),要求输出水池数。
题目分析:这里可对全图进行一次总搜索,当遇到w时,进行dfs,以递归的方式把相连的w标记为同一个值。全图搜索结束后,跟据水池最后一个值,输出水池数。
代码:
#include <stdio.h>
int a[102][102],b=1; //图不太大可以用二维数组
void f(int k,int t) //这个函数用来dfs
{
if(a[k][t]==1)
{a[k][t]=b; //标记
f(k,t+1); //对八个方向进行搜索
f(k+1,t+1);
f(k+1,t);
f(k+1,t-1);
f(k,t-1);
f(k-1,t-1);
f(k-1,t);
f(k-1,t+1);
}
}
int main()
{ void f(int k,int t);
int i,j,n,m;
char c;
scanf("%d%d",&n,&m);
getchar();
for(i=0;i<=n+1;i++) //接下来两个循环为图标明边界
{ //以0表示边界
a[i][0]=0;
a[i][m]=0;
}
for(i=0;i<=m+1;i++)
{
a[0][i]=0;
a[n][i]=0;
}
for(i=1;i<=n;i++) //输出图
{
for(j=1;j<=m;j++)
{
c=getchar();
if(c=='W') a[i][j]=1; //以1标明水
else a[i][j]=0; //以0表示干土,这于边界等价
}
getchar(); //换行时,小心回车键
}
/* printf("\n"); //打图代码与题无关,效果看下图
for(i=0;i<n+2;i++)
{
for(j=0;j<m+2;j++)
{printf("%2d",a[i][j]);
}
printf("\n");
}
printf("\n");*/
for(i=1;i<=n;i++) //全搜索
{
for(j=1;j<=m;j++)
{
if(a[i][j]==1)
{
b++; //每个水池值不同,等差递增
f(i,j); //遇到1就dfs
}
}
}
/* for(i=0;i<n+2;i++) //打图代码与题无关,效果看下图
{
for(j=0;j<m+2;j++)
{printf("%2d",a[i][j]);
}
printf("\n");
}*/
printf("%d\n",b-1);
return 0;
}
效果图: