hdu 1241 Oil Deposits
来源:互联网 发布:linux导出mysql数据表 编辑:程序博客网 时间:2024/06/11 13:34
题意:用广度优先搜索
//c++写输入时有问题
1)这个是深搜
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>/*map数组是用来装字符的n,m提高作用域,使访问的权限变高dir方便广度优先搜索,因为要搜索8个方向,这样做最方便*/char map[101][101];int n,m;int dir[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};int main(){ void breadthFirstSearch(int x,int y); bool isWithinMap(int x,int y); while(scanf("%d%d",&m,&n)!=EOF,n+m){ /* m是行指标 n是列指标 */ getchar(); for(int i=0;i<m;i++){ scanf("%s",map[i]); } int count=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(map[i][j]=='@'){ /* 擦掉当前点 */ breadthFirstSearch(i,j); count++; } } } printf("%d\n",count); } return 0;}/*px-pointxpy-pointybreadthFirstSearch广搜优先搜索*/void breadthFirstSearch(int x,int y){ bool isWithinMap(int x,int y); int px,py; for(int i=0;i<8;i++){ px = x+dir[i][0]; py = y+dir[i][1]; if(isWithinMap(px,py)&&map[px][py]=='@'){ /* 1)擦掉原来的@ 2)广搜该点 */ map[px][py] = '*'; breadthFirstSearch(px,py); } }}bool isWithinMap(int x,int y){ if(x<0||x>=m||y<0||y>=n){ return false; } return true;}
2)java广搜
import java.util.Scanner;/* * 使用广搜实现 */public class p1241 {/* * 相当于全局变量,减少内存的使用 */static Plot[][] plots = new Plot[101][101];static Queue queue = new Queue();static int dir[][] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 },{ 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } };static int m = 0;static int n = 0;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int count = 0;while (sc.hasNext()) {/* * m控制行 * n控制列 */m = sc.nextInt();n = sc.nextInt();if (m + n == 0) {return;}for (int i = 0; i < m; i++) {String str = sc.next();for (int j = 0; j < n; j++) {plots[i][j] = new Plot(i, j);plots[i][j].ch = str.charAt(j);}}count = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (plots[i][j].ch == '@') {/* * 通过广搜把相连的油田改变成"*" * 这样就可以减少访问次数了 */plots[i][j].ch = '*';queue.add(plots[i][j]);breadthFirthSearch();count++;}}}System.out.println(count);}}/* * */private static void breadthFirthSearch() {Plot plot = null;int px = 0;int py = 0;while (!queue.isEmpty()) {plot = queue.pop();for (int i = 0; i < 8; i++) {px = plot.x + dir[i][1];py = plot.y + dir[i][0];if (isWithinMap(px, py) && plots[px][py].ch == '@') {plots[px][py].ch = '*';queue.add(plots[px][py]);}}}}/* * x表示行值 * y表示列值 */private static boolean isWithinMap(int x, int y) {if (x < 0 || y < 0 || x >= m || y >= n) {return false;}return true;}}/* * plot油井 */class Plot {/* * 这道题思想简单化,没有写visited,parent * 你懂得,不用的变量不写才是高效的。 */char ch;int x;int y;public Plot(int x, int y) {this.x = x;this.y = y;}}/* * 建立自己的队列 */class Queue {final int FRONT = 0;Plot[] plots;int end;/* * 最多包含100块油井 */public Queue() {plots = new Plot[101];end = 0;}/* * 入栈函数 */public void add(Plot plot) {plots[end] = plot;end++;}/* * 出栈函数 */public Plot pop() {if (end <= 0) {return null;}Plot plot = plots[FRONT];for (int i = 0; i < end; i++) {plots[i] = plots[i + 1];}end--;return plot;}/* * 判断栈是否为空 */public boolean isEmpty() {if (end >= 1) {return false;}return true;}}
Oil Deposits
石油储量
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18046 Accepted Submission(s): 10399
Problem Description
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits.
GeoSurvComp地质调查公司负责检测地下石油资源储量。
GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots.
GeoSurvComp每次在一个大矩形区域中工作,创建一个网格,将土地划分为许多方形耕地。
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 file 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.
每一个网格的第一行,分别是m和n,表示网格是m行n列,每两个数字用一个空格隔开。
If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 and 1 <= n <= 100.
如果m=0着输入结束否着1 <= m <= 100 and 1 <= n <= 100。
Following this are m lines of n characters each (not counting the end-of-line characters).
每一行有n个字符(不包括回车符);
Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket.
每一个字符都要相对应的油田,“*”表示没有油井,“@”表示一个油井。
Output
For each grid, output the number of distinct oil deposits.
对于每一个网格,输出不同的石油资源的数量。
Two different pockets are part of the same oil deposit
对于不同的油井,
if they are adjacent horizontally, vertically, or diagonally.
如果在水平,垂直,斜角是相邻的,那么表示两个油井是一片油田。
An oil deposit will not contain more than 100 pockets.
一块油田最多包含100块油井。
Sample Input
1 1*3 5*@*@***@***@*@*1 8@@****@*5 5 ****@*@@*@*@**@@@@*@@@**@0 0
Sample Output
0122
Source
Mid-Central USA 1997
0 0
- HDU 1241Oil Deposits
- HDU---1241Oil Deposits
- Hdu 1241 Oil Deposits
- Hdu 1241 - Oil Deposits
- HDU-1241:Oil Deposits
- hdu 1241 Oil Deposits
- hdu 1241 Oil Deposits
- hdu 1241 Oil Deposits
- hdu - 1241 - Oil Deposits
- HDU-1241Oil Deposits
- hdu 1241 Oil Deposits
- hdu 1241 Oil Deposits
- HDU 1241 Oil Deposits
- hdu 1241 Oil Deposits
- hdu 1241 Oil Deposits
- HDU 1241 Oil Deposits
- hdu-1241-Oil Deposits
- hdu 1241 Oil Deposits
- objective C程序 封装、继承及多态
- 【剑指Offer面试题】 九度OJ1369:字符串的排列
- VC++游戏开发基础系列从入门到精通
- 欢迎使用CSDN-markdown编辑器
- 写给部分新入坑做移动端测试(Android)的同学
- hdu 1241 Oil Deposits
- Javascript-基础知识(6)
- shift+鼠标右键文件夹打开命令行直接进入当前目录
- 素因子分解
- 设计模式2-模板模式
- 最小生成树
- Android-单选按钮RadioButton和复选框checkbox
- vim的配置
- gradle 管理依赖库两个问题