紫书上面的例题
一个关于油田联通块的问题,书上用的是递归的dfs搜索,悄悄记录一下
* * * * @
* @ @ * @
* @ * * @
@ @ @ * @
@ @ * * @
#include<cstdio>
#include<cstring>
const int maxn = 100 + 5;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn];
void dfs(int r,int c,int id)
{
if(r < 0 || r >=m || c<0 ||c>=n)
return;
if(idx[r][c]>0 ||pic[r][c]!='@')
return ;
idx[r][c] = id;
for(int dr = -1; dr <= 1;dr++)//关于下一个寻找的方向
{
for(int dc =-1; dc <= 1; dc++)
{
if(dr!=0 || dc!=0)
{
dfs(r+dr,c+dc,id);
}
}
}
}
int main()
{
while(scanf("%d%d",&m,&n) == 2 && m && n)
{
for(int i = 0;i<m;i++)
scanf("%s",pic[i]);
memset(idx,0,sizeof(idx));
int cnt = 0;
for(int i = 0; i < m;i++)
{
for(int j = 0;j <n;j++)
{
if(idx[i][j]==0 && pic[i][j] == '@')
dfs(i,j,++cnt);
}
}
printf("%d\n",cnt);
}
return 0;
}
还有一种记录方向的方法,代码如下;
int dir[8][2] = {{-1,0},{-1,1},{0,1},{1,1},
{ 1,0},{1,-1},{0,-1},{-1,-1}};