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; 
} 
上一篇:对List中对象的去重


下一篇:第一章 JVM与Java体系结构