1011 Oil Deposits

1011 Oil Deposits

题意:一个m*n的地图,其中要么是*,要么是@,对于@代表油田,横、竖、斜连着的成为一个块,问总共有多油田。

思路:深搜,逐点搜索,对于不满足题意的点,返回上一层,继续搜索,直至所有点搜索完成。

#include<iostream>

#include<cstring>

using namespace std;

bool visit[111][111];

char map[111][111];

intdir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};

int sum,m,n,x,y;

bool isbound(int a,int b){

    if(a<1||a>m||b<1||b>n) returntrue;

    return false;

}

void dfs(int x,int y){

    for(int i=0;i<8;i++){

        if(map[x+dir[i][0]][y+dir[i][1]]=='*')continue;

        if(isbound(x+dir[i][0],y+dir[i][1]))continue;

        if(visit[x+dir[i][0]][y+dir[i][1]])continue;

        visit[x+dir[i][0]][y+dir[i][1]]=1;

        dfs(x+dir[i][0],y+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>>map[i][j];

              }

              sum=0;

              for(int i=1;i<=m;i++){

                for(int j=1;j<=n;j++)

               if(map[i][j]=='@'&&!visit[i][j]){

                    visit[i][j]=1;

                    dfs(i,j);

                    sum++;

                }

              }

              cout<<sum<<endl;

        }

        return 0;

}

你可能感兴趣的:(1011 Oil Deposits)