您的位置:首页 > 其它

BFS-Oil Deposits

2016-07-27 21:30 381 查看
Description

GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。

Input

输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。

Output

对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。

Sample Input

 

1 1

*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 
 

Sample Output

0

1
2
2

解题报告:利用广搜或深搜,结果为把油田搜索完的次数。

code:

BFS:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<stack>
#include<math.h>
#include<string.h>
#include<stdlib.h>

using namespace std;
typedef long long ll;
const int MAX=105;
int visited[MAX][MAX];
char s[MAX][MAX];
int dx[]={0,0,-1,1,1,-1,-1,1};
int dy[]={1,-1,0,0,-1,-1,1,1};
int m,n,sum=0;//sum为油田的个数;

struct node{
int i,j;
};

void bfs(int x,int y){
queue<node> q;
node t,next;
t.i=x;
t.j=y;
q.push(t);
visited[x][y]=1;
while(!q.empty()){
t=q.front();
q.pop();
for(int i=0;i<8;i++){
int xx=t.i+dx[i];
int yy=t.j+dy[i];
if(xx<0||xx>=m||yy<0||yy>=n||visited[xx][yy]||s[xx][yy]=='*')
continue;
visited[xx][yy]=1;
next.i=xx;
next.j=yy;
q.push(next);
}
}
}

int main(){
// freopen("input.txt","r",stdin);
while(~scanf("%d%d",&m,&n)&&m!=0){
for(int i=0;i<m;i++){
getchar();
for(int j=0;j<n;j++)
scanf("%c",&s[i][j]);
}
sum=0;
memset(visited,0,sizeof(visited));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(visited[i][j]||s[i][j]=='*')
continue;
sum++;
bfs(i,j);
}
printf("%d\n",sum);
}
}


DFS:
#include <iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;

const int MAX=105;
char a[MAX][MAX];
int visited[MAX][MAX];
int m,n,ans;
int dx[]={0,0,-1,-1,-1,1,1,1};
int dy[]={-1,1,-1,0,1,-1,0,1};

void dfs(int x0,int y0){
//@@****@*
if(x0==0&&y0==0)
visited[0][0]=1;
if(a[x0][y0]=='*')
return;
for(int i=0;i<8;i++){
int xx,yy;
xx=x0+dx[i];
yy=y0+dy[i];
if(!visited[xx][yy]&&xx>=0&&xx<m&&yy>=0&&yy<n&&a[xx][yy]!='*'){
visited[xx][yy]=1;
dfs(xx,yy);
}
}
}

int main(){
// freopen("input.txt","r",stdin);
while(cin>>m>>n&&m){
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
char ch;
cin>>ch;
a[i][j]=ch;
}
ans=0;
memset(visited,0,sizeof(visited));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(!visited[i][j]&&a[i][j]!='*'){
dfs(i,j);
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm BFS Oil Deposits