`
hellojyj
  • 浏览: 61735 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

ZOJ 1709 Oil Deposits

    博客分类:
  • ACM
阅读更多

原题传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1709

Oil Deposits

 


 

Time Limit: 2 Seconds      Memory Limit: 65536 KB

 


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 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. 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

 

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.

 


Sample Input

 

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

 


Sample Output

 

0
1
2
2

 


Source: Mid-Central USA 1997

 

 

分析:这道题目也就是简单的图的遍历和统计,主要思路有BFS和DFS,两种方法都可行,这里我用BFS来解决这道题目。主要思路就是用for for 找到一个‘@’,然后以它为首结点开始遍历与之相邻(上下左右。左上,左下,右上,右下)的所有‘@’,用一个空的队列保存每次读取到的结点,用while(!queue.empty()),来控制相邻油田块遍历,每次pop()出结点就访问它的相邻点,如果是@就放到队列,队列为空,就是while结束,那么就有油田数量就加1;访问过的@要做标记,以免for for中重复访问,这样最后输出的count(油田数量)就是问题的答案

 

源代码:

//图的BFS ZOJ 1709
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
const int MAXN = 101;
char list[MAXN][MAXN];
bool isVisited[MAXN][MAXN];
int m,n,count;
struct Pos{
    int x;
    int y;
};

void BFS(Pos pos,int m,int n){
    queue<Pos> bfque;
    bfque.push(pos);
    while(!bfque.empty()){
        Pos temp = bfque.front();
        bfque.pop();
        if(list[temp.x-1][temp.y] == '@' && temp.x-1>0 && !isVisited[temp.x-1][temp.y]){
            Pos newPos;
            newPos.x = temp.x-1;
            newPos.y = temp.y;
            bfque.push(newPos);
            isVisited[temp.x-1][temp.y] = true;
        }
        if(list[temp.x+1][temp.y] == '@' && temp.x+1<= m && !isVisited[temp.x+1][temp.y]){
            Pos newPos;
            newPos.x = temp.x+1;
            newPos.y = temp.y;
            bfque.push(newPos);
            isVisited[temp.x+1][temp.y] = true;
        }
        if(list[temp.x][temp.y-1] == '@' && temp.y-1>0 && !isVisited[temp.x][temp.y-1]){
            Pos newPos;
            newPos.x = temp.x;
            newPos.y = temp.y-1;
            bfque.push(newPos);
            isVisited[temp.x][temp.y-1] = true;
        }
        if(list[temp.x][temp.y+1] == '@' && temp.y+1<=n && !isVisited[temp.x][temp.y+1]){
            Pos newPos;
            newPos.x = temp.x;
            newPos.y = temp.y+1;
            bfque.push(newPos);
            isVisited[temp.x][temp.y+1] = true;
        }
        if(list[temp.x-1][temp.y-1] == '@' && temp.x-1>0 && temp.y-1>0 && !isVisited[temp.x-1][temp.y-1]){
            Pos newPos;
            newPos.x = temp.x-1;
            newPos.y = temp.y-1;
            bfque.push(newPos);
            isVisited[temp.x-1][temp.y-1] = true;
        }
        if(list[temp.x-1][temp.y+1] == '@' && temp.x-1>0 && temp.y+1<=n && !isVisited[temp.x-1][temp.y+1]){
            Pos newPos;
            newPos.x = temp.x-1;
            newPos.y = temp.y+1;
            bfque.push(newPos);
            isVisited[temp.x-1][temp.y+1] = true;
        }
        if(list[temp.x+1][temp.y-1] == '@' && temp.x+1<=m && temp.y-1>0 && !isVisited[temp.x+1][temp.y-1]){
            Pos newPos;
            newPos.x = temp.x+1;
            newPos.y = temp.y-1;
            bfque.push(newPos);
            isVisited[temp.x+1][temp.y-1] = true;
        }
        if(list[temp.x+1][temp.y+1] == '@' && temp.x+1<=m  && temp.y+1<=n && !isVisited[temp.x+1][temp.y+1]){
            Pos newPos;
            newPos.x = temp.x+1;
            newPos.y = temp.y+1;
            bfque.push(newPos);
            isVisited[temp.x+1][temp.y+1] = true;
        }

    }


}
main(){
     while(scanf("%d %d",&m,&n)!= EOF){
        if(m == 0&&n == 0)break;
        count = 0;
        for(int i=1;i<MAXN;i++){
            for(int j=1;j<MAXN;j++){
                isVisited[i][j] = false;
            }
        }
        for(int i=1;i<=m;i++){
            scanf("%s",list[i]+1);
        }

        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(list[i][j] == '@'&& !isVisited[i][j]){
                    Pos statPos;
                    statPos.x = i;
                    statPos.y = j;
                    BFS(statPos,m,n);
                    count++;
                }
            }
        }

        printf("%d\n",count++);

    }
}

 

0
0
分享到:
评论

相关推荐

    zoj 1404 Oil Pipeline.md

    zoj 1404 Oil Pipeline.md

    zoj 1002_zoj1002_

    【标题】"ZOJ 1002" 是一个在线编程竞赛题目,源自ZOJ(Zhejiang Online Judge),这是一个面向ACM/ICPC(国际大学生程序设计竞赛)的在线评测系统。题目编号1002,通常表示该题是ZOJ平台上的一个问题,可能涉及算法...

    zoj 源码700题

    【标题】"zoj 源码700题"是指一个包含700多道ZOJ(在线判题系统Zhejiang Online Judge)编程竞赛题目的源代码集合。这个资源对于学习算法、提高编程技能以及准备编程竞赛的学员来说极具价值。 【描述】"包含了zoj...

    ZOJ:浙江大学程序在线评测系统.docx

    ZOJ,全称“浙江大学程序在线评测系统”(Zhejiang University Online Judge),是一个提供信息学(算法竞赛)题库及程序评测的网站。以下是关于ZOJ的详细介绍: 一、基本信息 名称:浙江大学程序在线评测系统(ZOJ)...

    浙江大学ZOJ题目分类

    浙江大学ZOJ(Zhejiang University Online Judge)是一个在线编程练习平台,主要服务于计算机科学和技术的学习者,特别是对算法和编程有浓厚兴趣的学生。这个平台提供了大量的编程题目,涵盖了各种难度和主题,帮助...

    zoj.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar

    标题中的"ZOJ.gz_ ZOJ_ZOJ 1016_max flow_zoj 1045_zoj.rar" 提到了两个ZOJ(Zhejiang Online Judge)的题目,分别是1016和1045,这两个数字通常代表在线编程竞赛中的题目编号。这些题目通常涉及到算法和数据结构的...

    Problem Arrangement zoj 3777

    Problem Arrangement zoj 3777

    zoj1027解题指南

    【标题】"ZOJ1027解题指南"是一个针对特定编程竞赛题目——ZOJ1027的解决方案集合。ZOJ,全称为“Zhejiang Online Judge”,是浙江大学主办的一个在线编程竞赛平台,提供了丰富的算法题目供参赛者练习和挑战。本解题...

    ZOJ题目答案源码

    ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,主要面向计算机科学与信息技术的学生和爱好者,提供了大量的算法题目供参赛者练习和提交代码。"ZOJ题目答案源码"是一个压缩包文件,其中包含了700多道...

    ZOJ.zip_Jugs A_ZOJ NTA_zoj acm_zoj acm 1216_zoj code

    【ZOJ.zip】是一个压缩包,里面包含了与ZOJ(Zhejiang Online Judge)相关的ACM(International Collegiate Programming Contest)题解。ZOJ是一个在线编程竞赛平台,它为参赛者提供了一系列算法题目进行练习,以...

    zoj 题库 详细解答 解题代码

    zoj 题库 详细解答 解题代码 该资源主要涵盖了 zoj 题库中的各种编程题目,涵盖了基本算法、数据结构、数学运算等多个方面的知识点。下面是对该资源中出现的知识点的详细解释: 1. 第一次 ACM 总结(7th ACM) 该...

    zoj 700源代码

    ZOJ,全称为Zhejiang Online Judge,是一个知名的在线编程竞赛平台,主要服务于浙江大学和国内其他高校的学生,提供丰富的算法题目供参赛者练习和比赛。这个压缩包文件名为"ZOJ 700多题源代码",意味着它包含了解决...

    ACM训练必备POJ ZOJ题目分类及解题思路

    学习ACM程序设计的朋友一定要看,这是训练必备的POJ ZOJ题目分类及解题思路

    zoj.rar_zoj_zoj4041

    《ZOJ 4041问题的正确解法与程序分析》 ZOJ(Zhejiang Online Judge)是一个知名的在线编程竞赛平台,其中的题目编号为4041的题目吸引了众多程序员的关注。本篇文章将深入探讨ZOJ 4041的正确解法,并对提供的源代码...

    ZOJ1014.zip_zoj code_zoj1004

    标题“ZOJ1014.zip_zoj code_zoj1004”表明这是一个与ZOJ(ZeroJudge)在线判题系统相关的代码压缩包,其中可能包含了解决ZOJ问题1004的源代码。ZOJ是面向编程爱好者和学生的一个在线编程竞赛平台,它提供了各种算法...

    zoj 1003c 语言的

    zoj 1003 c语言的,要写这么多描述吗。。

    zoj1951的AC代码

    本代码是zoj上AC的1951的代码,把双重循环简化为O(n),不过素数判断的改进还不够

    ZOJ1805代码

    ZOJ1805代码

    ZOJ月赛 题解 (ZOJ Monthly, August 2014)

    **ZOJ月赛题解 (ZOJ Monthly, August 2014)** ZOJ(Zhejiang Online Judge)是中国著名的在线编程竞赛平台之一,它为程序员和学生提供了丰富的算法练习和比赛机会。2014年8月的ZOJ月赛是一场面向广大编程爱好者的...

    ZOJ题解集合-截至2835

    ZOJ(Zhejiang Online Judge)是一个著名的在线编程竞赛平台,尤其在ACM(国际大学生程序设计竞赛)领域中有着广泛的影响力。这个“ZOJ题解集合-截至2835”显然是一份包含了大量ZOJ题目解决方案的压缩包,其中涵盖了...

Global site tag (gtag.js) - Google Analytics