挑战程序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 ...
随机推荐
- JavaWeb三大组件——过滤器的运行机制理解
过滤器Filter 文章前言:本文侧重实用和理解. 一.过滤器的概念. lFilter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 ...
- 通过href简单实现单击a链接跳转到页面指定位置
在页面中点击a标签后,要使其跳到页面里面相应的地方,方法很简单,就是在a标签里面href中的内容和你要跳到这个区域的id同名即可,例如: <a href="#ppp" tar ...
- 【leedcode】 Longest Palindromic Substring
Given a , and there exists one unique longest palindromic substring. https://leetcode.com/problems/l ...
- web前端程序员真的值这么多钱吗?
对于互联网公司来说用户就是上帝,做好客户体验一切才有可能.所以互联网公司都会把钱砸向前端,Web前端程序员也越来越受到企业争相聘用. 前端工程师工资也越来越高,目前Web前端工程师工作1~2年后通常会 ...
- Python学习【第三篇】Python变量
变量 声明变量 #!/usr/bin/env python name = "Bourbon" 上述代码声明了一个变量,变量名为:name,变量的值为:"Bourbon&q ...
- 搭建git for windows服务器(100%可以成功)
既然Git在Linux下面非常好用,为什么还要搭建git windows的服务器,因为不是所有的用户都需要在linux下面做开发,对吧,还有很多用户选择使用windows做开发. 看到很多网友尝试部分 ...
- 使用TreeView 使用多选功能
1.要用TreeView多选就要显示复选框,TreeView默认不显示复选框,显示复选框: TreeView2.ShowCheckBoxes = TreeNodeTypes.All; 初始化TreeV ...
- Leetcode: Circular Array Loop
You are given an array of positive and negative integers. If a number n at an index is positive, the ...
- 解决checkbox的attr(checked)一直为undefined问题
需要做个一个全选的checkbox功能,遇到checkbox的attr("checked")一直为undefined,下面与大家分享下最终的解决方案 最近本屌丝应项目开发需求, ...
- sql语句把字段中的某个字符去掉
sql语句把字段中的某个字符去掉 )),'http://demo.m-school.net','') 例如: )),'http://192.168.2.180','') )),'http://zpzx ...