博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits【DFS】
阅读量:5811 次
发布时间:2019-06-18

本文共 2131 字,大约阅读时间需要 7 分钟。

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 17768   Accepted: 9440

Description

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.

Input

The input contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket.  

Output

are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.

Sample Input

1 1*3 5*@*@***@***@*@*1 8@@****@*5 5 ****@*@@*@*@**@@@@*@@@**@0 0

Sample Output

0122

Source

 >> 

问题链接:。

问题描述参见上文。

问题分析

本题可以使用深度优先搜索求解。本题用广度优先搜索也可以求解,差别不大。

这个程序说明如下:

1.方向数组 使用方向数组后,各个方向的试探的程序就会变得简洁了,用循环处理即可。

2.避免重复搜索 将搜索过的节点设置为“*”(荒地,非油田),可以避免重复搜索,能够简化程序逻辑。

3.设置边界 通过设置边界,可以免去矩阵(二维数组)的边界判断,简化了程序逻辑。

该问题与图遍历中寻找联通块问题基本上是同构的,算法思路一致。

程序说明

每当找到一个油田,只需要计数加一,并且使用DFS算法把与其相邻的8个油田擦除即可(避免重复计数)。

与网上许多程序相比,这个程序要简洁一些。

AC的C语言程序如下:

/* HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits */#include 
#include
#define DIRECTSIZE 8struct direct { int drow; int dcol;} direct[DIRECTSIZE] = {
{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};#define MAXN 100char grid[MAXN+2][MAXN+2];void dfs(int row, int col){ int i; for(i=0; i

转载于:https://www.cnblogs.com/tigerisland/p/7564631.html

你可能感兴趣的文章
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
LNMP一键安装
查看>>
SQL Server数据库概述
查看>>
Linux 目录结构及内容详解
查看>>
startx命令--Linux命令应用大词典729个命令解读
查看>>
华为3026c交换机配置tftp备份命令
查看>>
Oracle命令导入dmp文件
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
Http、TCP/IP协议与Socket之间的区别(转载)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>