题目:Oil Deposits
题意:给出地图,求有多少块连在一起的油田。横着竖着斜着相邻的算一块。
思路:dfs找联通块。
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int n,m;
char a[105][105]= {0};
bool use[105][105]= {0};
int sum=0;
int M1[9]={0, 0,1,1, 1,-1,-1,-1};
int M2[9]={1,-1,0,1,-1, 0, 1,-1};
void init() {
sum=0;
memset(a,0,sizeof(a));
memset(use,0,sizeof(use));
for(int i=0; i<n; i++) {
scanf("%s",a[i]);
}
}
void dfs(int x,int y){
use[x][y]=true;
for(int i=0;i<8;i++){
int x_=x+M1[i],y_=y+M2[i];
if(0<=x_&&x_<n&&0<=y_&&y_<m&&a[x_][y_]=='@'&&!use[x_][y_]) dfs(x_,y_);
}
}
int main() {
while(scanf("%d%d",&n,&m)==2&&n!=0) {
init();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='@'&&!use[i][j]) {
sum++;
dfs(i,j);
}
}
}
printf("%d\n",sum);
}
return 0;
}