HDU 1241:Oil Deposits(dfs+染色)

HDU 1241:Oil Deposits(dfs+染色)

題目鏈接

題意:
n* m的方塊,代表一塊大油田;其中’@‘表示該位置有油,’*'代表該位置沒有油;求有多少小塊油田
(需要注意的是:彼此相連的都屬於同一塊小油田:其中就包括上、下、左、右、對角線方向)

題解:
一開始想到的就是並查集;發現似乎並不是特別簡單,如果是方針的可能會好處理點;
然後想了好久,其實就是一個染色問題啊,直接dfs+剪枝+染色即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#define lowbit(x) x&(-x)
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+10;
int n,m;
char mp[110][110];
int vis[110][110];
int cnt;
int dirx[9]={0,-1,-1,0,1,1,1,0,-1};
int diry[9]={0,0,1,1,1,0,-1,-1,-1};
void init(){
    memset(mp,0,sizeof(mp));
    memset(vis,0,sizeof(vis));
    cnt=0;
}
int check(int x,int y){
    if(x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0&&mp[x][y]=='@'){
        return 1;
    }
    else
        return 0;
}
void dfs(int x,int y){
    for(int i=1;i<=8;i++){
        int fx=x+dirx[i];
        int fy=y+diry[i];
        if(check(fx,fy)){
            vis[fx][fy]=1;
            mp[fx][fy]='*';
            dfs(fx,fy);
        }
    }
    return ;
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        if(n==0&&m==0)
            break;
        init();
        for(int i=1;i<=n;i++){
            scanf("%s",mp[i]+1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(check(i,j)){
                    cnt++;
                    vis[i][j]=1;
                    mp[i][j]='*';
                    dfs(i,j);
                }
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章