Lake Counting_深度搜索_递归


Lake Counting

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 30414   Accepted: 15195

Description

Due to recent rains, water has pooled in various places in Farmer John‘s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W‘) or dry land (‘.‘). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

Given a diagram of Farmer John‘s field, determine how many ponds he has.

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: M characters per line representing one row of Farmer John‘s field. Each character is either ‘W‘ or ‘.‘. The characters do not have spaces between them.

Output

* Line 1: The number of ponds in Farmer John‘s field.

Sample Input

10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

Sample Output

3

Hint

OUTPUT DETAILS:

There are three ponds: one in the upper left, one in the lower left,and one along the right side.

Source

USACO 2004 November

[Submit]   [Go Back]   [Status]   [Discuss]

感觉自己一直没有系统的训练,从网上买了一本挑战程序设计竞赛,开始挨着刷题,这是第一道。

#include <iostream>
#include <cstdio>

#define L 120

using namespace std;

int n,m;
char a[L][L];
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};

void dfs(int x,int y){
    a[x][y]=‘.‘;
    for(int i=0;i<8;i++){

            int t=x+dx[i];
            int t2=y+dy[i];
            if(a[t][t2]==‘W‘ && t>=0 && t<n && t2>=0 &&t2<m){
                dfs(t,t2);
            }
    }
}

int main()
{
    int cou=0;
    while(~scanf("%d %d",&n,&m)){
        getchar();
        cou=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                scanf("%c",&a[i][j]);
            }
            getchar();
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(a[i][j]==‘W‘){
                    dfs(i,j);
                    cou++;
                }
            }
        }
        printf("%d\n",cou);

    }
    return 0;
}
时间: 2024-11-03 22:46:13

Lake Counting_深度搜索_递归的相关文章

【动态规划】skiing_深度搜索_动态规划

问题 B: [动态规划]skiing 时间限制: 1 Sec  内存限制: 128 MB提交: 28  解决: 11[提交][状态][讨论版] 题目描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个 区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7

深度搜索应用之黑白图像(非递归)

深度搜索应用之黑白图像(非递归) 前言: 使用深度搜索,有两个方法:递归,栈.本质是栈. 递归有一个缺陷,栈溢出.栈有一个缺陷,程序相对递归更复杂. 练习题: 输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数.如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块.(题意是让求连在一起的块有几个,图见书本)   使用递归求解:点这里 使用栈求解: 1 #include <iostream> 2 #include <memory.h> 3 #inc

深度搜索入门

深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态,直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此重复,直到找到最终的解. 做这类题目,抓住两样东西:1.总体上递归几次(几层)?每一次递归确定一层上的数. 2.每次递归,有几种选择的情况.所以dfs()函数,只有两部分(if.else结构):1.(if部分)若每一层都选择了,判断是否符合条件,做出题目要求的操作.2.(else部分)若还有层没有选择,就做出选择,所有选择的情况列出. 下面是几个考察dfs的题目: 1.部

DFS深度搜索的一般思想

对于无向图来说DFS深度搜索 递归思想 //深度优先搜索DFS的一般实现 void DFS(MGraph G,int i)//DFS递归思想 { int j; visited[i]=TRUE;//设置Node已经被访问 printf("%c",G.vexs[i]); for(j=0;j<numVertexes;j++)//对此Node跟Node2(j)遍历 如果arc[][]==1则表明当前DFS的Node与Node2(j)连通,且满足Node2未被访问的条件下 则对Node2进

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

hdu--1978--记忆化深度搜索||递推

这题 我开始的做法是 记忆化搜索  但是tm地竟然tle了...很想不通 因为数据很小啊 就100 虽然方案的总数可能会很大.. 然后 我就去百度 记忆化搜索 看下是不是我用错方法了 事实证明 我虽然没有用错 但还是 学到了很多=-=. 其实  我很早以前 也看过关于 记忆化搜索的一些介绍 但是 并没有太多感觉 并不是那些作者写的不好 而是我的水平没到 感受不了.. 很多东西会在不知不觉中提升~ 我想 将我读的这篇介绍 传到这篇博客里来 似乎只能上传照片和视频=-=   那我给个链接吧  传送

迷宫寻址中深度优先搜索的递归和非递归算法比较

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 本文只探究迷宫寻址中深度优先搜索的递归和非递归算法比较,其他相关代码详见<迷宫问题(巧若拙)>http://blog.csdn.net/qiaoruozhuo/article/details/41020745 深度优先搜索的递归算法是很容易实现的,只需设置一个驱动函数,然后递归调用子函数就可以了. 代码如下: int DeepSearchWay()//寻找路径:深度搜索 { CopyMiGong

使用深度搜索分析心理调查问卷的研究

使用深度搜索分析心理调查问卷的研究 背景 昨天我女朋友发了一个心理调查问卷要我做.我向来对这种形似心理调查问卷嗤之以鼻: 一个人的性格怎么可能由几个简单的问题决定.但作为技术人员,我决定用技术的手段分析这份调查问卷,向女朋友证明其缺乏科学性. 调查问卷的原版如下图 有兴趣的朋友可以玩玩~ 我想了解如下几个问题: 1. 问卷是不是有环路?如果有环路,则可证明这份问卷不正规. 2. A 答案是不是不可能达到?因为4个答案中,只有A答案没有同的倾向. 3. 如果 A 答案能到达,那么有多少种可能?占比

深度搜索DFS!

好的,接下来就是本萌新的第一篇博客啦.直接上深搜!深度优先搜索(Depth-First-Search),简称“深搜”(dfs),是我们蒟蒻们最基本的搜索操作之一.简单地说,深搜就是递归.下面是抄来的解释:深度优先搜索用一个数组存放产生的所有状态.(1) 把初始状态放入数组中,设为当前状态:(2) 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态:(3) 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态:(4) 判断当前状态是否为目标状态,如果是目