搜索—Problem_1011-Oil Deposits
题意
搜索石油块问题。题目说明,@代表有石油,*代表没有石油,而在一个有石油的地方它的周围8个方向的地方如果也有石油,那么这2块则石油是属于一块。,给出图,问图中有几块石油田。
解题思路
使用DFS搜索,首先搜索图中第一个出现@的位置,然后对其8个方向进行搜索,并对搜索过的为@进行标记,直到一次搜索结束则油田总数加一,最后的总数即为所求的石油的方块数。
感想
上课时讲过的例题,作为DFS的基础题目,从而了解到这一类题目的做法,虽然有些复杂,但基本的搜索策略是大致相同的。
AC代码
#include <iostream>
#include <cstring>
using namespace std;
bool visit[110][110]; //重复访问控制
char maze[110][110]; //地图
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八个方向
int sum,m,n,sx,sy;
//判断边界
bool isbound(int a,int b)
{
if(a<1 || a>m || b<1 || b>n)return true;
return false;
}
//对每一个点进行深搜
void dfs(int sx,int sy)
{
for(int i=0;i<8;i++)
{
if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障碍返回
if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//边界返回
if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已访问,返回
visit[sx+dir[i][0]][sy+dir[i][1]]=1; //标记已访问,防止重复访问
dfs(sx+dir[i][0],sy+dir[i][1]);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0) break;
memset(visit,0,sizeof(visit));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>maze[i][j];
}
}
sum=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(maze[i][j]=='@'&& !visit[i][j])
{
visit[i][j]=1;
dfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}