Oil Deposits(HD_1241)BFS

题目描述:见杭电OJ http://acm.hdu.edu.cn/showproblem.php?pid=1241

题目思路:题目大意为求油田的连通分量,可以用两个for循环遍历整个图,当遇到为油田时,分量数加一,并且使用DFS将相连的油田标记为已走过,最后输出分量总数。

代码如下:

#include"stdio.h"
#include"string.h"
#include"iostream"
using namespace std;
int map[105][105];
int n,m;
int count=0; //记油井数
void DFS(int i,int j)
{
 map[i][j]=0;
 //向上走
 if(i-1>=1&&map[i-1][j]==1)
  DFS(i-1,j);
 //向下走
 if(i+1<=n&&map[i+1][j]==1)
  DFS(i+1,j);
 //向左走
 if(j-1>=1&&map[i][j-1]==1)
  DFS(i,j-1);
 //向右走
 if(j+1<=m&&map[i][j+1]==1)
  DFS(i,j+1);
 //向左上走
 if(i-1>=1&&j-1>=1&&map[i-1][j-1]==1)
  DFS(i-1,j-1);
 //向右上走
 if(i-1>=1&&j+1<=m&&map[i-1][j+1]==1)
  DFS(i-1,j+1);
 //向左下走
 if(i+1<=n&&j-1>=1&&map[i+1][j-1]==1)
  DFS(i+1,j-1);
 //向右下走
 if(i+1<=n&&j+1<=m&&map[i+1][j+1]==1)
  DFS(i+1,j+1);
}
int main()
{
 while(scanf("%d%d",&n,&m)!=EOF)
 {
  if(n==0&&m==0)
   break;
  count=0;
  //存图
  char ch;
  for(int i=1;i<=n;i++)
   for(int j=1;j<=m;j++)
   {
    cin>>ch;
    if(ch=='*')
     map[i][j]=0;
    else
     map[i][j]=1;
   }
  //遍历图
  for(int i=1;i<=n;i++)
   for(int j=1;j<=m;j++)
   {
    if(map[i][j]==1)
    {
     count++;
     DFS(i,j);
    }
   }
  printf("%d\n",count);
  
 }
 
 return 0;
}



你可能感兴趣的:(遍历,DFS,杭电,连通分量)