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