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;
}