hdu1241详解 Java广搜搞定

import java.util.Scanner;

public class Main{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int m = sc.nextInt();//输入地图的行数
			int n = sc.nextInt();//输入地图的列数
			if (m == 0) {//若m=0则退出程序
				break;
			}
			// 初始化图
			Plot[][] plots = new Plot[m][n];//用来表示地图中每个点的信息
			for (int i = 0; i < m; i++) {
				String str = sc.next();  //用来接受地图
				for (int j = 0; j < n; j++) {
					//把每个点都赋值横坐标,纵坐标,和地质情况
					plots[i][j] = new Plot();
					plots[i][j].x = i;
					plots[i][j].y = j;
					plots[i][j].c = str.charAt(j);
				}
			}
			// 搜索,查看有几个图块
			int count = 0;//表示探测到的油田的片数
			for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					//找到油田位置,并对其进行广度搜索
					if (plots[i][j].c == '@' && !plots[i][j].isVisited) {//地址为油田和没有被搜索过
						// 广搜
						PlotQue queue = new PlotQue();
						queue.add(plots[i][j]);//把上面搜索到的油田加入到队列中
						bfs(plots, queue);
						count++;
					}
				}
			}
			System.out.println(count);//输出油田的片数,即最后的结果
		}
	}

	private static void bfs(Plot[][] plots, PlotQue queue) {
		int px, py;
		int m = plots.length;
		int n = plots[0].length;
		while (!queue.isEmpty()) {//保证队列不为空
			Plot plot = queue.pop(); //弹出队列的元素
			//在该元素周围进行广度搜索
			for (int i = 0; i < 8; i++) {
				px = plot.x + dir[i][0];
				py = plot.y + dir[i][1];
				//不能越界,地质为油田和没有被搜索过
				if (px >= 0 && px < m && py >= 0 && py < n
						&& plots[px][py].c == '@' && !plots[px][py].isVisited) {
					plots[px][py].isVisited = true;
					queue.add(plots[px][py]);
				}
			}
		}
	}

	final static int dir[][] = { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 },
			{ -1, -1 }, { 1, -1 }, { -1, 1 }, { 1, 1 } };//上,下,左,右,左上,右上,左下,右下

}
//用来每个点
class Plot {
	int x, y;//表示点的位置
	char c;  //表示点地质情况
	boolean isVisited = false; //表示该点是否被搜索过
}
 //队列
class PlotQue {
	Plot plots[];   //队列中装的元素
	final int FRONT = 0;//表示队列的第一个元素
	int end;  //用来表示队列中的元素个数,指向队列的最后一个元素
	//构造函数
	public PlotQue() {
		plots = new Plot[100];
		end = 0;
	}
	//添加元素
	public void add(Plot p) {
		plots[end] = p;// 把p加入到队列中
		end++; //元素个数加一
	}
	//弹出元素
	public Plot pop() {
		//如果队列为空,直接返回null
		if (end <= 0) {
			return null;
		}
		//弹出第一个元素
		Plot p = plots[FRONT];
		//把弹出去的元素的位置补上,所有队列元素往前面移一位
		if (end > 1) {
			for (int i = 0; i < end; i++) {
				plots[i] = plots[i + 1];
			}
		}
		end--;//元素个数减一
		return p; //返回元素p
	}
	//判断队列是否为空
	public boolean isEmpty() {
		if (end == 0) {
			return true;
		}
		return false;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 20:44:55

hdu1241详解 Java广搜搞定的相关文章

详解java动态代理

生活中的代理: 比如一个明星成名了以后,是需要有一个代理的,因为太多人想找他签名,应付不来,那么这个时候代理的作用是拦截你对真正明星的访问,他可以拦截下来收点费用,再叫真正的明星过来为你签名. 程序中的代理: 1,要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等,你准备如何做? 2,编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码 下图显示了在程序中代理的调用原理(

Protocol Buffer技术详解(Java实例)

Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发团队中目前主要使用的开发语言就是C++.Java和Python,其中Python主要用于编写各种工具程序.然而为了保证该篇Blog的完整性和独立性,我仍然会将上一篇Blog中已经出现的内容再一次赘述,同时对于Java中特有的部分也会着重介绍.          一.生成目标语言代码.      下面

详解Java解析XML的四种方法

(1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允许应用程序对数据和结构做出更改. ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据. [缺点] ①通常需要加载整个XML文档来构造层次结构,消耗资源大. [解析详解] ①构建Document对象: DocumentBuilderFactory dbf = DocumentBu

详解Java中代码块和继承

本文发表于个人GitHub主页,原文请移步详解Java中代码块和继承 阅读. 概念 1.代码块 局部代码块 用于限定变量生命周期,及早释放,提高内存利用率 静态代码块 对类的数据进行初始化,仅仅只执行一次. 构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块. 2.继承 继承是已有的类中派生出新的类,新的类能够吸收已有类的数据属性和行为,并能扩展新的功能. 代码块的执行顺序 public class Test {    public String name

详解java垃圾回收机制(转)及finalize方法(转)

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变.垃圾收集的目的在于清除不再使用的对象.GC通过确定对象是否被活动对象引用来确定是否收集该对象.GC首先要判断该对象是否是时候可以收集.两种常用的方法是引用计数和对象引用遍历. 引用计数收集器 引用计数是垃圾收集器中的早期策略.在这种方法中,堆中每个对象(不是

Java学习之道:详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

【Java】详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XS

【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.net/article/48380.htm 学习一下java 最近重新复习了一下java基础,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象 如题,首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘User

面试必备:详解Java I/O流,掌握这些就可以说精通了?

@TOC Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题.我们把数据源和目的地可以理解为IO流的两端.当然,通常情况下,这两端可能是文件或者网络连接. 我们用下面的图描述下,加深理解: 从一种数据源中通过InputStream流对象读入数据到程序内存中 在这里插入图片描述 当然我们把上面的图再反向流程,就是OutputStream的示意了. 在这里插入图