#include <stdio.h>
char a[100][100];
int b[100][100],m,n;
int x[8]={-1,-1,-1,0,0,1,1,1};
int y[8]={-1,0,1,-1,1,-1,0,1};
//深度优先算法
void dfs(int i,int j)
{
int k;
int tx;
int ty;
b[i][j]=1;
for(k=0;k<8;k++)
{
tx=i+x[k];
ty=j+y[k];
if(tx>=0&&tx<m&&ty>=0&&ty<n&&b[tx][ty]==0&&a[tx][ty]=='@')
dfs(tx,ty);
}
}
//广度优先算法 :visit操作(此处为将b[i][j]置1)既可以在入队列前进行,也可以在出队列后进行
void bfs(int i,int j)
{
//构造队列
int queue[1000][2];
int tx,k,ty,cx,cy;
int tail=0;
int head=0;
//将结点压入队列
queue[tail][0]=i;
queue[tail][1]=j;
tail++;
// b[i][j]=1;
while(tail>head)//队列为空结束
{
//将队首元素出队列 ,并标记为已访问
cx=queue[head][0];
cy=queue[head][1];
b[cx][cy]=1;
head++;
//访问出队列元素的邻接点
for(k=0;k<8;k++)
{
tx=cx+x[k];
ty=cy+y[k];
if(tx>=0&&tx<m&&ty>=0&&ty<n&&a[tx][ty]=='@'&&b[tx][ty]==0)//若为邻接点,且未被访问,则将其压入队列
{
queue[tail][0]=tx;
queue[tail][1]=ty;
tail++;
// b[tx][ty]=1;
}
}
}
}
int main()
{
int i,j,count,k;
count=0;
//初始化油田
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
scanf("%s",&a[i]);
//置油田未访问标记为0
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
b[i][j]=0;
}
//从第一个到最后一个油田进行dfs
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(a[i][j]=='@'&&b[i][j]==0)
{bfs(i,j);
count++;
}
//打印油田数
printf("%d",count);
return 0;
}
油田勘测(深度优先算法,广度优先算法)
程序员文章站
2022-05-21 16:24:08
...