title: HDU-1241
categories:
- ACM
- BFS
tags: - 圖的連通區域
- 水題
date: 2020-02-23 19:57:05
簡單BFS,找到一個入隊點將所有可達的區域置爲不可達
題目
油藏
*時間限制:2000/1000 MS(Java /其他)內存限制:65536/32768 K(Java /其他)
提交總數:58896接受提交:33745
*
問題描述
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
算法
#include<stdio.h>
#include<iostream>
#include<string.h>
#include <queue>
#include<math.h>
using namespace std;
int dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,-1,1,-1,-1,1};
char map[101][101];
struct Point{
int x,y;
} a,b;
int h,l;
void bfs(int x,int y){
queue<Point> q;
a.x=x;
a.y=y;
q.push(a);
map[x][y]='*';
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=0;i<8;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(b.x>=0&&b.x<h&&b.y>=0&&b.y<l&&map[b.x][b.y]=='@')
{
map[b.x][b.y]='*';
q.push(b);
}
}
}
}
int main()
{
//freopen("input.txt", "r", stdin);
while(cin>>h>>l&&h&&l)
{
int sum=0;
for(int i=0;i<h;i++)
{
for(int j=0;j<l;j++)
{
cin>>map[i][j];
}
}
for(int i=0;i<h;i++)
{
for(int j=0;j<l;j++)
{
if(map[i][j]=='@')
{
bfs(i,j);
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}