挑战程序设计竞赛——详解DFS及BFS

一.学会要用到的stl函数,Stack、Quene、Pair

1.Stack(DFS隐式的用到,并与Queue对比记忆)

头文件==#include==

stack常用函数

  • push() 入栈
  • top() 获得栈顶元素
  • pop() 弹出栈顶元素
  • empty() 可以检测stack内是否为空,返回true为空,返回false为非空
  • size() 返回stack内元素的个数

Quene(BFS中用到)

头文件==#inclde==

queue常用函数

  • push() 在队尾插入一个元素
  • pop() 删除队列第一个元素
  • empty() 可以检测queue内是否为空,返回true为空,返回false为非空
  • size() 返回队列中元素个数
  • **front() ** 返回队列中的第一个元素
  • back() 返回队列中最后一个元素

[^]: Stack和Queue的函数中==,增删判空都一样,只有查不一样== ,其中Stack用top(),Queue用front()、back()

Pair(BFS中用到,也可以用结构体,顺便提一句,Pair也是用结果体实现)

头文件==#include ==

Pair常用函数

  • p1.first; // 返回对象p1中名为first的公有数据成员
  • p1.second; // 返回对象p1中名为second的公有数据成员

例一Lake Counting (POJ No.2386)>

由于最近的降雨,在 Farmer John 的田地的各个地方积水,由 N x M (1 <= N <= 100; 1 <= M <= 100) 正方形组成的矩形表示。每个方格包含水(‘W’)或旱地(‘.’)。农夫约翰想弄清楚他的田地里形成了多少池塘。池塘是一组相连的正方形,里面有水,其中一个正方形被认为与其所有八个邻居相邻。

给定农民约翰的田地图,确定他有多少池塘。

限制条件

  • N,M <= 100

样例

输入


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

输出


3


代码如下:

#include <bits/stdc++.h>//万能头文件
/*
#include <iostream>
*/
using namespace std;
const int maxl = 105;int dir[8][2] = {{1, -1}, {1, 0}, {1, 1}, {0, -1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}};//斜左下、下、斜右下、左 、右、斜右上、上、斜左上
char mp[maxl][maxl];
bool book[maxl][maxl];//是否检查过
int n, m, ans = 0;void dfs(int x, int y){//把相连的水都标记 book[x][y] = true;for (int i = 0; i < 8; i++){int nx = x + dir[i][0];int ny = y + dir[i][1];if (nx >= 0 && nx < n && ny >= 0 && ny < m && mp[nx][ny] == 'W' && !book[nx][ny]){dfs(nx, ny);}}
}
int main(){cin >> n >> m;//输入 for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){cin >> mp[i][j];}memset(book, 0, sizeof(book));//初始化 for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if(mp[i][j] == 'W' && !book[i][j]){//是水并且没来过 dfs(i, j); ans++;}}cout << ans;return 0;}

例二迷宫的最短路径

给定一个大小为 N \times MN×M 的迷宫,由通道和墙壁组成。

每一步可以向相邻的上下左右四个方向移动。

请求出起点到终点的最小步数。本题保证从起点一定能走到终点。

# 表示墙壁,不可走。 . 表示通道,可走。S 表示起点。G 表示终点。

限制条件

  • N, M <= 100

样例

输入


10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

输出


22


代码如下

版本一使用pair

#include <bits/stdc++.h>
using namespace std;const int maxl = 100;int n, m, sx, sy, gx, gy, ans = 0;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};//下、上、右、左
char mp[maxl][maxl];//存储地图
bool book[maxl][maxl];//检查是否来过
typedef pair<int, int> P;//存放点(x,y)
int d[maxl][maxl];//存放据起始点经过的步数 int bfs(){queue<P> que;que.push(P(sx, sy));while (!que.empty()){P p = que.front();que.pop();if(p.first == gx && p.second == gy)    break;for (int i = 0; i < 4; i++){int nx = p.first + dir[i][0];int ny = p.second + dir[i][1];if (nx >= 0 && nx < n &&  ny >= 0 && ny < m && mp[nx][ny] != '#' && !book[nx][ny]){que.push(P(nx, ny));(mp[nx][ny] == '.' || mp[nx][ny] == 'G')  等价于  mp[nx][ny] != '#'book[nx][ny] = true; d[nx][ny] = d[p.first][p.second] + 1;}}}return d[gx][gy];
}int main(){cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){cin >> mp[i][j];if(mp[i][j] == 'S'){sx = i;sy = j;}if(mp[i][j] == 'G'){gx = i;gy = j;}
}memset(book, 0, sizeof(book));memset(d, 0, sizeof(d));cout << bfs();return 0;
}

版本二使用结构体

#include <bits/stdc++.h>
using namespace std;const int maxl = 100;int n, m, gx, gy, sx, sy;
char mp[maxl][maxl];
bool book[maxl][maxl];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};typedef struct node{int x, y;int d; //省了记录路径的数组 node (int x, int y, int d){    //构造函数 this->x = x;this->y = y;this->d = d;}
}node;int dfs(){queue<node> que;node nod(sx, sy, 0);que.push(nod);book[sx][sy] = true;while (!que.empty()){node t = que.front();que.pop();if (t.x == gx && t.y == gy)return t.d;for (int i = 0; i < 4; i++){int nx = t.x + dir[i][0];int ny = t.y + dir[i][1];if (nx >= 0 && nx < n && ny >= 0 && ny < m && mp[nx][ny] != '#' && !book[nx][ny]){que.push(node(nx, ny, t.d + 1));book[nx][ny] = true;}}}return 0;
}
int main(){cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){cin >> mp[i][j];if (mp[i][j] == 'S'){sx = i;sy = j;}if (mp[i][j] == 'G'){gx = i;gy = j;}
}cout << dfs();
}

总结

  1. BFS总是先搜索距离初始状态近的状态,而DFS从最开始的状态出发不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态。
  2. DFS像栈(先进后出),BFS就是队列(先进先出)

挑战程序设计竞赛——详解DFS及BFS相关推荐

  1. 挑战程序设计竞赛(第二章习题总结)

    文章目录 搜索 Curling 2.0(POJ 3009) Meteor Shower(POJ 3669) Smallest Difference(POJ 2718) Hopscotch(POJ 30 ...

  2. 《挑战程序设计竞赛》--初级篇习题POJ部分【2.4 - 2.6】

    这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是2.4 ~ 2.6部分: 导航 2.4 加工并存储的数据结构 优先队列 Sunscreen MooUnivers ...

  3. 《挑战程序设计竞赛》--初级篇习题POJ部分【穷竭搜索+贪心】

    最近看了<挑战程序设计竞赛>初级篇,这里总结一下部分poj上的练习题,主要涉及方面为: 穷竭搜索 and 贪心算法 具体题目: 简单导航 一.穷竭搜索 二.贪心算法 一.穷竭搜索 穷竭搜索 ...

  4. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  5. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)

    白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...

  6. 【操作指导 | 代码实现】挑战程序设计竞赛2:算法和数据结构

    书籍封面 第一章 前言 1. 本人衷心建议 ~~~~~~       如果你是一位初学者,我指的是你只会基本的 C/C++ 编程,即使编的很烂,这本书对于你算法和数据结构的提升非常有帮助,所涉及的每一 ...

  7. 挑战程序设计竞赛:反转法

    挑战程序设计竞赛:反转法 1. 题目介绍 1.1 题目 1.2 样例 2. 思路讲解 2.1 视频讲解 2.1 反转法(开关问题) 3. 练习题 4. 附录:程序代码 4.1 Java 4.2 C++ ...

  8. 《挑战程序设计竞赛》 读后感(转载)

    <挑战程序设计竞赛> 读后感 最近要开始准备面试找工作,算法是准备的重中之重,舍友推荐了<挑战程序设计竞赛>这本书.花了一周的时间大体过了一遍,该书真切地让我理解了" ...

  9. 《挑战程序设计竞赛》之“反转”问题总结

    <挑战程序设计竞赛>之"反转"问题总结 萌新又来写总结了 "反转"问题在<挑战程序设计竞赛>P150左右的位置~ 拒!绝!搜!索! 这类 ...

最新文章

  1. python入门要什么基础-python需要什么基础
  2. python 冷门_csvkit---python一个牛逼到不行的csv处理库
  3. 在非UI线程中处理Bitmap
  4. 1.Docker的安装以及配置国内源
  5. java8 入门脚本之家_Java 8中的Lambda表达式
  6. mongodb 库数量限制_MongoDB in 数量限制
  7. android studio8.0,Android Studio错误:(8,0)未找到ID为’android’的插件
  8. 怎么用python画房子_怎么用python画小猪佩奇
  9. 不谈商业模式,为什么众筹新闻难成功
  10. Package Control 使用
  11. nginx 域名跳转
  12. 使用Editplus查看空格
  13. 关注物业公司信息化建设
  14. 20个必不可少的Python第三方库(存干货分享)!
  15. g2o:一种图优化的C++框架
  16. 数据结构与算法学习笔记——数据结构(四):单向环形链表(约瑟夫问题)
  17. 常见的SSL证书错误代码及解决方法
  18. Percent Library百分比布局详解
  19. 我们以为长大了就很懂得爱,却不明白小孩子才是最懂爱的(小王子,豆瓣9.0)
  20. 全球与中国玻璃通孔中介层市场深度研究分析报告

热门文章

  1. 2022-2028年全球与中国氨(NH3)气体传感器行业发展趋势及投资战略分析
  2. 支付宝H5,微信H5,微信公众号支付回调
  3. Telegram Bot 使用文档
  4. html 设置图片显示比例,css巧妙设置等比例图片显示
  5. 微信小程序-wxml笔记(更新中)
  6. 第14章 14.1 来自Bitly的USA.gov数据(1)
  7. 最佳实践 缓存穿透,瞬间并发,缓存雪崩的解决方法
  8. 如何有效设计你的调查问卷?
  9. 百度APP视频播放中的解码优化
  10. java hypot_Java StrictMath hypot()方法与示例