杭电oj-1241 油藏
题目
问题描述
GeoSurvComp地质勘测公司负责检测地下油藏。GeoSurvComp一次处理一个大矩形区域的土地,并创建一个将土地
划分为多个正方形图的网格。然后,它使用传感设备分别分析每个地块,以确定该地块是否包含油。包含油的地
块称为矿穴。如果两个凹坑相邻,则它们是同一油藏的一部分。积油可能很大,可能包含许多凹穴。您的工作是
确定网格中包含多少种不同的油藏。。
输入值
输入文件包含一个或多个网格。每个网格均以包含m和n的行开始,网格中的行和列数为m和n,并用单个空格分
隔。如果m = 0,则表示输入结束;否则,输入0。否则为1 <= m <= 100和1 <= n <=100。紧随其后的是m行,每
行n个字符(不计算行尾字符)。每个字符对应一个地块,要么是代表无油的“ *”,要么是代表油囊的“ @”。
输入量
对于每个网格,输出不同的油藏数量。如果两个不同的油藏在水平,垂直或对角线上相邻,则它们是同一油藏的
一部分。积油最多可容纳100个口袋。
样本输入
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
样本输出
0
1
2
2
思路
先找到一个@然后从这里开始进行BFS搜索,把@本身以及周围的@都变成‘ * ’表示访问过这一片是一块油藏,然后继续在地图上找@。
代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int m,n;
char map[105][105];
int dx[8]={0,1,1,1,0,-1,-1,-1}; //8个方位//
int dy[8]={1,1,0,-1,-1,-1,0,1};
void BFS();
bool noway(int x,int y); //判断是否有路//
struct Node{
int x;
int y;
}cur;
queue <Node> q;
int main (){
while (scanf("%d%d",&m,&n) && m+n)
{
int ans=0;
for (int i = 0; i <m ; ++i) {
scanf("%s",map[i]);
}
for (int i = 0; i <m ; ++i) {
for (int j = 0; j <n ; ++j) {
if (map[i][j]=='@'){
ans++;
cur.x=i;
cur.y=j;
map[cur.x][cur.y]='*';
q.push(cur);
BFS();
}
}
}
printf("%d\n",ans);
}
return 0;
}
bool noway(int x,int y){
if (map[x][y]=='*')
return true;
if (x<0 || x>=m || y<0 || y>=n)
return true;
return false;
}
void BFS(){
Node next;
while (!q.empty()){
cur=q.front();
q.pop();
int nx,ny;
for (int i = 0; i <8 ; ++i) {
nx=cur.x+dx[i];
ny=cur.y+dy[i];
if (noway(nx,ny))
continue;
next.x=nx;
next.y=ny;
map[nx][ny]='*';
q.push(next);
}
}
}