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;
}
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;
}
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- js算法: 图的两种表示方法以及广度优先算法
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833