BFS练习-POJ.2386
Lake Counting
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 35122 Accepted: 17437
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.
OutputLine 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.
我的理解是每一次BFS之后一个水洼就都被替换成’W’,当不存在’W’的时候,说明没有水洼了,那么BFS的次数就是水洼的数目,每个点只扫描一次。
#include<iostream>
#include<queue>
#define N 110 //比题目指定的N范围大一点
#define M 110
using namespace std;
typedef pair<int, int> point; //这个时候写pair比结构体要方便一点
int res = 0; //符合要求的水洼数目
char maze[N][M]; //记录整个地图
void BFS(int x,int y)
{
queue<point>que; //建立队列
point current; //记录当前的点的信息
int i, j, dx, dy, dir_1, dir_2;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (maze[i][j] == 'W') //如果当前这个点是积水
{
que.push(point(i,j)); //就加入队列
maze[i][j] = '.'; //标记已经搜索过了这个点
while (!que.empty()) //判断队列是否为空
{
current = que.front(); //取出队首元素
que.pop(); //弹出第一个元素,不返回
for (dir_1 = -1; dir_1 <= 1; dir_1++) //8个方向的遍历
{
for (dir_2 = -1; dir_2 <= 1; dir_2++)
{
dx = current.first + dir_1, dy = current.second + dir_2; //坐标的变化
if (dx >= 0 && dx < x&&dy >= 0 && dy < y&&maze[dx][dy] != '.') //判断是否这个点合法
{
que.push(point(dx, dy)); //合法则加入队列
maze[dx][dy] = '.'; //标记这个点已经搜索过了
}
}
}
}
res++; //水洼数目+1
}
}
}
}
void solve()
{
int k = 0, x, y;
cin >> x >> y;
for (k = 0; k < x; k++)
{
cin >> maze[k];
}
BFS(x,y);
cout << res << endl;
}
int main(void)
{
solve();
return 0;
}
BFS练习-POJ.2386的更多相关文章
- POJ 2386 Lake Counting【BFS】
题意:给出一个矩形,问有多少块连通的W 当找到W的时候,进行广搜,然后将搜过的W变成点,直到不能再搜,进行下一次广搜,最后搜的次数即为水塘的个数 看的PPT里面讲的是种子填充法. 种子填充算法: 从多 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 【BFS】POJ 3278
POJ 3278 Catch That Cow 题目:你要去抓一头牛,给出你所在的坐标和牛所在的坐标,移动方式有两种:要么前一步或者后一步,要么移动到现在所在坐标的两倍,两种方式都要花费一分钟,问你最 ...
- 【BFS】POJ 2251
POJ 2251 Dungeon Master 题意:有一个地图,三维,走的方向是上下,左右,前后.问你最小步数从起始点走到出口. 思路:三维的BFS,就是多加一组状态,需要细心(不细心如我就找了半个 ...
- POJ 2386
http://poj.org/problem?id=2386 这个题目与那个POJ 1562几乎是差不多的,只不过那个比这个输入要复杂一些 #include <stdio.h> #incl ...
- poj - 2386 Lake Counting && hdoj -1241Oil Deposits (简单dfs)
http://poj.org/problem?id=2386 http://acm.hdu.edu.cn/showproblem.php?pid=1241 求有多少个连通子图.复杂度都是O(n*m). ...
- DFS----Lake Counting (poj 2386)
Lake Counting(POJ No.2386) Description Due to recent rains, water has pooled in various places in Fa ...
- DFS/BFS(同余模) POJ 1426 Find The Multiple
题目传送门 /* 题意:找出一个0和1组成的数字能整除n DFS:200的范围内不会爆long long,DFS水过~ */ /************************************ ...
- POJ 2386 Lake Counting DFS水水
http://poj.org/problem?id=2386 题目大意: 有一个大小为N*M的园子,雨后积起了水.八连通的积水被认为是连接在一起的.请求出院子里共有多少水洼? 思路: 水题~直接DFS ...
随机推荐
- @enable跟@import注解
参考文章: 讲@import的相关内容:https://blog.csdn.net/u012437781/article/details/78626134 讲为什么registrar没有注入:http ...
- typescript的lambads解决this关键字找不到属性
var people = { name: ["abc", "jack", "pepter", "jim"], getna ...
- RadControl使用相同的Theme
我們僅須對兩個地方加一些程式碼,就可使所有的RadControl擁用相的Theme,如此一下不但可使Ap內布景主題一致,設計者亦不需要對每個控件做字型,顏色,大小等等瑣碎的設計. App.Xaml.c ...
- php 设置虚拟目录
php 设置虚拟目录两个步骤,很简单. 第一,打开安装apache目录下的conf下面的httpd.conf文件. 找到IfModule 标记, 再它下面添加红色方框中的内容.注意不能少东西. ...
- 链表例题2:链表的倒数第k个节点是多少
解题思想: 1.创建一个结点类(为后面实现链表做基础) 2.创建一个查询倒数元素的方法 3.使用快慢指针的思想(主要的部分) 图中的表示的是查询倒数第k个结点的操作: 创建一个快慢指针后pre(慢指针 ...
- iOS中MD5加密字符串实现
1.MD5加密 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321 ...
- vue学习第二天 ------ 临时笔记
学习链接: vue.js官方文档: https://cn.vuejs.org/v2/guide/index.html vue.js API: https://cn.vuejs.org/v2/api/# ...
- SQLServer 连接和联合
一.内连接(inner join) 默认省略inner ,内连接是严格过滤,等同where限制,连接两端的表都数据都需要过滤. 二.左外连接(left outer join) 以左表为基准进行数据连接 ...
- java:xml解析
DOM.SAX.JDOM.DOM4J四种解析:https://www.cnblogs.com/longqingyang/p/5577937.html Java解析XML文件例子:https://blo ...
- 第五章 存储过程&触发器
1.前言 2.存储过程和触发器->存储过程 ·理解:是一组SQL命令集合,经过预编译存放在系统中:就像java程序里的方法,可以重复的被调用: 在日常的数据库操作中,会有大量的T-SQL批处理. ...