bfs,队列
bfs
bfs=队列
队列的操作
#include<deque>
声明方法:
1、普通声明
queue<int>q;
2、结构体
struct node
{
int x, y;
};
queue<node>q;
操作(假设已经定义队列为q)
q.pop() 删除对顶元素
q.push() 加入一个元素
q.size() 返回优先队列中拥有的元素个数
q.top() 返回优先队列对顶元素
优先队列
声明方式:
1、普通方法:
priority_queue<int>q; //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>, greater<int> >q; //通过操作,按照元素从小到大的顺序出队
2、自定义优先级:
struct cmp {
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue<int, vector<int>, cmp>q; //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
3、结构体声明方式:
struct node {
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q; //定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
bfs 由近到远的扩散过程
**例题**
一个长方形的房间,铺着方砖,每块砖是 #或黑点. 。
一个人站在黑砖上,可以按上、下、左、右方向移动到相邻的砖。
他不能在#上移动,他只能在黑砖上移动。
起点是@,要求:遍历所有黑点。






(b)1出队,1的邻居2, 3进队。当前队列{2, 3}。
(可以理解为:从1扩散到2、3。)
(c)2出队,2的邻居4, 5, 6进队。当前队列{ 3, 4, 5, 6}。
(从2扩散到4、5、6。)
(d)3出队,7, 8进。当前队列{ 4, 5, 6, 7, 8}。
(从3扩散到7、8。)
**解决**
定义图形和移动方向
int dir[][]={ //左上角坐标是(0, 0)。顺时针。
{-,}, //向左。
{,-}, //向上
{,}, //向右
{,} //向下
};
循环解决
for(int i=; i<; i++) {
//按左、上、右、下,4个方向顺时针逐一搜索。
next.x = start.x + dir[i][];
next.y = start.y + dir[i][];
if(CHECK(next.x,next.y) && room[next.x][next.y]=='.') {
room[next.x][next.y]='#';
//进队之后,标记为已经处理过。
num++;
q.push(next);
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
char room[][];
int dir[][] = {
{-,}, //向左。左上角坐标是(0, 0)
{,-}, //向上
{,}, //向右
{,} //向下
};
int Wx, Hy, num; //Wx行,Hy列。用num统计可走的位置有多少
#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy) //是否在room里
struct node {int x,y;};
void BFS(int dx,int dy){
num=; //起点也包含在砖块内
queue <node> q; //队列中放坐标点
node start, next;
start.x = dx;
start.y = dy;
q.push(start);
while(!q.empty()) {
start = q.front();
q.pop();
//cout<<"out"<<start.x<<start.y<<endl; //打印出队列情况,进行验证
for(int i=; i<; i++) { //按左、上、右、下,4个方向顺时针逐一搜索
next.x = start.x + dir[i][];
next.y = start.y + dir[i][];
if(CHECK(next.x,next.y) && room[next.x][next.y]=='.') {
room[next.x][next.y]='#'; //进队之后,标记为已经处理过
num++;
q.push(next);
}
}
}
}
int main(){
int x, y, dx, dy;
while (cin >> Wx >> Hy) { //Wx行,Hy列
if (Wx== && Hy==) //结束
break;
for (y = ; y < Hy; y++) { //有Hy列
for (x = ; x < Wx; x++) { //一次读入一行
cin >> room[x][y];
if(room[x][y] == '@') { //读入起点
dx = x;
dy = y;
}
}
}
num = ;
BFS(dx, dy);
cout << num << endl;
}
return ;
}
bfs,队列的更多相关文章
- POJ 3278 Catch That Cow[BFS+队列+剪枝]
第一篇博客,格式惨不忍睹.首先感谢一下鼓励我写博客的大佬@Titordong其次就是感谢一群大佬激励我不断前行@Chunibyo@Tiancfq因为室友tanty强烈要求出现,附上他的名字. Catc ...
- BFS 队列
Plague Inc. is a famous game, which player develop virus to ruin the world. JSZKC wants to model thi ...
- 农夫过河 (BFS)(队列)
1 .问题描述 要求设计实现农夫过河问题(农夫带着一只狼,一只养,一棵白菜,一次只能带一个东西)如何安全过河. 2 .问题的解决方案: 可以用栈与队列.深度优先搜索算法及广度优先搜索算法相应的原理去解 ...
- 拆边+BFS队列骚操作——cf1209F
这个拆边+队列操作实在是太秒了 队列头结点存的是一个存点集的vector,1到这个点集经过的路径权值是一样的,所以向下一层拓展时,先依次走一遍每个点的0边,再走1边...以此类推,能保证最后走出来的路 ...
- POJ——3278 Catch That Cow(BFS队列)
相比于POJ2251的三维BFS,这道题做法思路完全相同且过程更加简单,也不需要用结构体,check只要判断vis和左右边界的越界情况就OK. 记得清空队列,其他没什么好说的. #include< ...
- hdoj 2612 Find a way【bfs+队列】
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- poj 3278 Catch That Cow(bfs+队列)
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- HDU 6171 Admiral(双向BFS+队列)题解
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现 ...
- 剑指offer:对称的二叉树(镜像,递归,非递归DFS栈+BFS队列)
1. 题目描述 /** 请实现一个函数,用来判断一颗二叉树是不是对称的. 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的 */ 2. 递归 思路: /** 1.只要pRoot.left和 ...
- bfs(队列模板)
[题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. [输 ...
随机推荐
- <Android 应用 之路> 百度地图API使用(4)
前言 百度地图的定位功能和基础地图功能是分开的,使用的是另外的jar包和so库文件,详情请关注官网: 百度定位SDK 配置 下载对应的jar包和so库,然后移动到lib目录下 AS中注意事项 sour ...
- Python爬虫教程-10-UserAgent和常见浏览器UA值
Python爬虫教程-10-UserAgent和常见浏览器UA值 有时候使用爬虫会被网站封了IP,所以需要去模拟浏览器,隐藏用户身份, UserAgent 包含浏览器信息,用户身份,设备系统信息 Us ...
- unity震动效果
using System.Collections; using System.Collections.Generic; using UnityEngine; //思想:在短时间内在规定圆内随机震动对象 ...
- SpringBoot访问html访问不了的问题
springboot默认是不支持jsp的 注意pom.xml是否添加了thymeleaf的依赖 <dependency> <groupId>org.springframewor ...
- 如何在 Azure 中的经典 Windows 虚拟机上设置终结点
在 Azure 中使用经典部署模型创建的所有 Windows 虚拟机都可以通过专用网络通道与同一云服务或虚拟网络中的其他虚拟机自动通信. 但是,Internet 或其他虚拟网络中的计算机需要终结点将入 ...
- 封装和 property方法
封装其实就是一个类用双下划线把自己的属性或者方法给限制住 不让其他的类直接调用或者修改 必须通过这个类来进行操作,这个类通过双下划线__把自己的属性和方法给限制住了 封装就是私有的过程 把父类中的属 ...
- python面向对象编程(1)——基本概念,术语,self,构造器
1 python面向对象命名规范 类名通常由大写字母打头.这是惯例标准. 数据值应该使用名词作为名字,方法使用动词加对象的方式,若使用混合记法,则方法名的第一个字母首字母小写,后面的单词的首字母大写 ...
- July 28th 2017 Week 30th Friday
If equal affection cannot be, let the more loving be me. 如果没有相等的爱,那就让我爱多一点吧. There is seldom equal a ...
- iOS自动化-iOS录屏xrecord及解决iPhone设备不显示的问题
github地址:https://github.com/WPO-Foundation/xrecord 安装方法: git clone https://github.com/WPO-Foundation ...
- DZ拿shell总结
今天碰到一个dz的站,好久没拿了 ,拿下shell觉得应该总结一下 Uc_server默认密码 其实有了UC_SERVER就是有了网站的全部权限了,有了UC_SERVER你可以重置管理员密码 可以进后 ...