HDU 1241 Oil Deposits bfs 难度:0

http://acm.hdu.edu.cn/showproblem.php?pid=1241

对每个还未访问的点bfs,到达的点都标为一块,最后统计有多少块即可

#include <cstdio>

#include <cstring>

#include <queue>

using namespace std;

const int maxn=101;

const int inf=0x3fffffff;

char maz[maxn][maxn];

int id[maxn][maxn];

int n,m,cnt;



queue<int> que;

const int dx[8]={0,0,1,-1,1,1,-1,-1};

const int dy[8]={1,-1,0,0,1,-1,1,-1};

bool in(int x,int y){

        return x>=0&&x<n&&y>=0&&y<m;

}

void bfs(int sx,int sy){

        while(!que.empty())que.pop();

        id[sx][sy]=++cnt;

        que.push(sx*maxn+sy);

        while(!que.empty()){

                int x=que.front()/maxn,y=que.front()%maxn;que.pop();

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

                        int tx=x+dx[i],ty=y+dy[i];

                        if(in(tx,ty)&&maz[tx][ty]!='*'&&id[tx][ty]==-1){

                                id[tx][ty]=id[x][y];

                                que.push(tx*maxn+ty);

                        }

                }

        }

}



int main(){

        while(scanf("%d%d",&n,&m)==2&&n){

                cnt=0;

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

                        scanf("%s",maz[i]);

                }

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

                        for(int j=0;j<m;j++){

                                id[i][j]=-1;

                        }

                }

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

                        for(int j=0;j<m;j++){

                                if(maz[i][j]!='*'&&id[i][j]==-1){

                                        bfs(i,j);

                                }

                        }

                }



                printf("%d\n",cnt);

        }

        return 0;

}

  

你可能感兴趣的:(HDU)