挑战程序2.1.5 穷竭搜索>>宽度优先搜索
先对比一下DFS和BFS
深度优先搜索DFS 宽度优先搜索BFS


明显可以看出搜索顺序不同。
DFS是搜索单条路径到底部,再回溯。
BFS是搜索近的状态,直到底部,一般在求解最短路径或者最短步数上应用。
BFS要用到队列呢。。
队列的用法看一看
map的基本操作函数: C++Maps 是一种关联式容器,包含“关键字/值”对 begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 equal_range() 返回特殊条目的迭代器对 erase() 删除一个元素 find() 查找一个元素 get_allocator() 返回map的配置器 insert() 插入元素 key_comp() 返回比较元素key的函数 lower_bound() 返回键值>=给定元素的第一个位置 max_size() 返回可以容纳的最大元素个数 rbegin() 返回一个指向map尾部的逆向迭代器 rend() 返回一个指向map头部的逆向迭代器 size() 返回map中元素的个数 swap() 交换两个map upper_bound() 返回键值>给定元素的第一个位置 value_comp() 返回比较元素value的函数
map的简单操作函数
练习题系列………………………………………………………
因为步数(折返)的问题撸了一天。。
如果那个点可以走,那么就推入队列,等待搜索。
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
][],step[][];
typedef pair<int, int> P;
struct stu{
int x; int y; int t;
};
];
]={, , , -, };
]={, , , , -};
void zha(int M) {
memset(map1, -, sizeof(map1));
; i < M; i++)
; k < ; k++){//five points are burst.
int nx = ch[i].x + dx[k];
int ny = ch[i].y + dy[k];
&& nx < && ny >= && ny < && (ch[i].t < map1[ny][nx] || map1[ny][nx] == -))
map1[ny][nx] = ch[i].t;//give everypoint the minimum burst time.
}
}
int bfs() {
queue <P> que;
que.push( P (, ));
memset(step, -, sizeof(step));
step[][]=;
while(que.size()) {
P p= que.front();
que.pop();
){//find map1's -1 and print it
return step[p.first][p.second];
}
if(step[p.first][p.second] >= map1[p.first][p.second])continue;//the point had benn burst,so jump it
; i < ; i++) {//this is the point of four diretions that does not been destroy.
int nx = p.first + dx[i],ny = p.second + dy[i];
&& ny >= &&step[nx][ny] == -)//if it can arrive and does not exceed the map
{
que.push(P(nx, ny));//push it to the queue and go
step[nx][ny]=step[p.first][p.second]+;//of course,step must add 1 when go.
}
}
}
;
}
int main()
{
int M,a;
while(~scanf("%d",&M))
{
; i<M; i++)
scanf("%d%d%d",&ch[i].x,&ch[i].y,&ch[i].t);
zha(M);
a=bfs();
printf("%d\n",a);
}
;
}
POJ3669
还是要用个地图标记一下步数,不然会计算错误。
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
typedef pair<int, int> P;
int sx,sy,H,W,N;
][];
][];
] = {,,-,};
] = {,,,-};
void find1(int g){
; i < W; i++)
; k < H; k++)
)){
if(map1[i][k] == 'S') map1[i][k] ='.';
sx = i; sy = k;
return ;
}
}
int bfs(int n)
{
memset(step,-,sizeof(step));
queue <P> que;
que.push(P (sx,sy));
step[sx][sy] = ;
while(que.size()){
int x = que.front().first, y = que.front().second;
que.pop();
; i < ; i++){
int xn = x + dx[i], yn = y + dy[i];
&& xn < W && yn >= && yn < H && map1[xn][yn] != )
{
step[xn][yn] = step[x][y] + ;
))
{
return step[xn][yn];
}
que.push(P(xn, yn));
}
}
}
;
}
int main()
{
cin >> W >> H >> N;
; i < W; i++)
; k < H; k++)
cin >> map1[i][k];
;
find1();
step += bfs();
; i < N; i++)
{
find1(i);
step += bfs(i+);
}
cout << step << endl;
;
}
AOJ0558
#include <iostream>
#include <queue>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
]={ , -, , -};
map<string, int> dp;
void bfs(){
queue<string> que;
que.push(");
dp[;
while(que.size()){
string now =que.front();
que.pop();
;
; j < ; j++)
'){
p=j;
break;
}
; i < ; i++){
int pn= p + d[i];
&& pn < && !(p == && i == )
&& !(p == && i == )){
string next = now;
swap(next[p],next[pn]);
if(dp.find(next) == dp.end()){
dp[next] = dp[now] + ;
que.push(next);
}
}
}
}
return ;
}
int main()
{
string line;
bfs();
while(getline(cin,line))
{
line.erase(remove(line.begin(), line.end(), ' '), line.end());
cout << dp[line] << endl;
}
;
}
AOJ0121
挑战程序2.1.5 穷竭搜索>>宽度优先搜索的更多相关文章
- 挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386 思路:(⊙v⊙)嗯 和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...
- 搜索与图论②--宽度优先搜索(BFS)
宽度优先搜索 例题一(献给阿尔吉侬的花束) 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔 ...
- [宽度优先搜索] FZU-2150 Fire Game
Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...
- 【BFS宽度优先搜索】
一.求所有顶点到s顶点的最小步数 //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...
- 层层递进——宽度优先搜索(BFS)
问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...
- BFS算法的优化 双向宽度优先搜索
双向宽度优先搜索 (Bidirectional BFS) 算法适用于如下的场景: 无向图 所有边的长度都为 1 或者长度都一样 同时给出了起点和终点 以上 3 个条件都满足的时候,可以使用双向宽度优先 ...
- 宽度优先搜索--------迷宫的最短路径问题(dfs)
宽度优先搜索运用了队列(queue)在unility头文件中 源代码 #include<iostream>#include<cstdio>#include<queue&g ...
- 算法基础⑦搜索与图论--BFS(宽度优先搜索)
宽度优先搜索(BFS) #include<cstdio> #include<cstring> #include<iostream> #include<algo ...
随机推荐
- Createjs学习一
需求1:根据后端返回过来的不同信息,实现长按保存图与文字片功能(图片都是一样的,文字信息不同) 首先我们来分析一下要求,得出需要用到哪些技术.长按保存这一功能只针对图片,文字长按的话只会出现复制.. ...
- JS基础知识
JavaScript的三个不同的组成部分: (1)ECMAScript,提供核心语言功能,所有浏览器大体上都支持ECMA第三版 (2)文本对象模型(DOM),提供访问和操作网页内容的方法和接口 (3) ...
- Python 面向对象(初级篇)
51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
- linux–nohup命令(转)
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/my ...
- Android 解析Json_fastJson
FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能. 实际上其他的json处理工具都和 ...
- 使用MaskFilter
使用MaskFilter MaskFilter类可以为Paint分配边缘效果. 对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换.Android包含了下面几种MaskFil ...
- [CC]手动点云分割
CloudCompare中手动点云分割功能ccGraphicalSegmentationTool, 点击应用按钮后将现有的点云分成segmented和remaining两个点云, //停用点云分割功能 ...
- Win10 HOSTS锁定 无法提权 修改 解决办法 100%有效
折腾了N久 各种百度,Google 什么复制粘贴法,什么管理员CMD法 什么修改权限法 统统没用.... 其实只需要 WINPE 进入老毛桃, 复制粘贴. 重启电脑 直接搞定 ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- CentOS7安装ftp服务器
一.问题的提出 想在windows环境下远程连接CentOS的文件并编辑 二.问题的解决 # 安装vsftp服务[root@localhost ~]# yum -y install ftp vsftp ...