HDU-1241


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; 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章