记录----第一次使用BFS(广度搜索)学习经验总结
学习经验记录与分享——
最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验。
首先第一个要了解的是"queue"(队列函数),BFS以这个为核心展开,我先把队列函数常用用法写一下:
1.queue<队列数据类型> 队列名;例如:queue<int> Q;意思是创建一个存入int类型元素的队列。(接下来队列名都以Q示范)
2.Q.push(存入相应类型的元素名);
3.Q.pop();释放队列中的第一个元素
4.Q.front();访问队列中的第一个元素
5.Q.back();访问队列中的最后一个元素
6.Q.empty();如果队列元素为空,则返回真值,相反若不为空则返回假值
7.Q.size();队列元素个数
在这里讲一下队列的基本概念,可以简单说成两个门,一个入口,一个出口,先入队列的最靠近出口,也就是第一个元素,可以看下这个代码:
#include<bits/stdc++.h> using namespace std; int main (int argc, const char * argv[])
{
queue<int> Q;
for(int i=;i<;i++)
{
Q.push(i); //入队
}
for(int j=;j<;j++)
{
cout<<Q.front()<<" "; //打印
Q.pop(); //弹出
}
return ;
}
这行代码具体意思就是先将0-9这10个int类型值入队,然后打印一个释放一个,可以自己操作一下。
队列的基本概念就这些,想知道更详细可以去网上搜。
接下来说主题BFS,举个例子,一个迷宫,从起点出发有三条路线通往终点,BFS的大概方式就是三条路线同时走,当其中一条先到达终点时则该条为最短路径,同时走的特点及为BFS的一个特性“宽度搜索”,不需要一条一条走,最后再去比较走的步数,宽度搜索能够较快的找出最优解,我拿一个我第一个写的有关于BFS的题目吧,同为新手的刚了解BFS的也可以去试一试,是一道BFS裸题,很适合熟悉BFS概念:
Knight Moves骑士的移动
A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square of a given set of n squares on a chessboard exactly once. He thinks that the most difficult part of the problem is determining the smallest number of knight moves between two given squares and that, once you have accomplished this, finding the tour would be easy. Of course you know that it is vice versa. So you offer him to write a program that solves the ”difficult” part. Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
Input
The input file will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a..h) representing the column and a digit (1..8) representing the row on the chessboard.
Output
For each test case, print one line saying ‘To get from xx to yy takes n knight moves.’
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
题意:意思就是国际棋盘上骑士从一个点到另外一个点的最短移动距离,按照国际象棋的规定移动(在一个3*2的格子里照对角线移动),棋盘规格为8*8.(如果不了解去搜国际象棋棋盘和骑士的移动规则)
解题思路:用BFS层层递进,直到走到终点为止,注意判断移动是否脱离棋盘,和记录走过的坐标。
解题代码:
#include<bits/stdc++.h>
using namespace std; int y_d[][]={-,,-,,,,,,,-,,-,-,-,-,-}; //骑士移动规则
int q_p[][],step,endx,endy;//记录点
char st1[],st2[];//起点终点 struct node{
int x,y,step; //可把该结构体看做每一次移动的记录点
}; int check(int x,int y) //检查移动是否越界
{
if(x<||y<||x>=||y>=||q_p[x][y])return ; return ;
} int bfs()
{
queue<node> Q; //注意,队列可以插入结构体
node start,next,end; //起点;下一步;到达后的点
start.x=st1[]-'a';start.y=st1[]-''; //把输入的起点存入相应结构体
start.step=; //初始化步数
endx=st2[]-'a';endy=st2[]-''; //终点,同上
memset(q_p,,sizeof(q_p)); //把棋盘数组归0
q_p[start.x][start.y]=; //将起点记录移动过的点的意思
Q.push(start); //起点结构体入队
while(!Q.empty()){ //在while循环中循环直到走到终点 返回相应值
end = Q.front(); //访问队列中第一个元素并用一个变量记录
Q.pop(); //弹出队列第一个元素
if(end.x==endx&&end.y==endy) //这一条是判断起点是否就是终点的
return end.step;
for(int i=;i<;i++) //该for循环则为BFS的宽度搜索概念的实体化了,层层搜索
{
next.x=end.x+y_d[i][];next.y=end.y+y_d[i][];
if(next.x==endx&&next.y==endy)
return end.step+;
if(check(next.x,next.y))//判断是否越界
continue;
next.step = end.step+;q_p[next.x][next.y]=;
Q.push(next); //将下一步的移动的点入队
}
}
return ;
}
int main (int argc,const char * argv[])
{
while(~scanf("%s %s",st1,st2)){
int a=bfs();
printf("To get from %s to %s takes %d knight moves.\n",st1,st2,a);
}
return ;
}
学习经历少的第一次了解BFS看懂这个可能比较难(大佬除外),但勤能补拙嘛,我也不过看了一晚上才搞懂这个的(手动滑稽),不过不急,慢慢来,先为下一次学习订个目标:熟练使用BFS,了解DFS。
以上内容如果错误欢迎改正。
记录----第一次使用BFS(广度搜索)学习经验总结的更多相关文章
- 分享记录我的Linux系统入门学习经验
人生很多事情都是巧合,或者说命中注定.就拿Linux于我来说,大学期间也修了Linux基础这门课,但是从来没有想到自己会从事与Linux相关的工作,更没有想过自己可以通过Linux获取更多的东西. 真 ...
- 修道士与野人问题(BFS广度搜索)
#include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { i ...
- 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)
去年秋季参加了校园招聘,有幸拿到了BAT.头条.网易.滴滴.亚马逊.华为等offer,经过研究生两年的学习积累,终于达成了自己的目标,期间也经历了很多,谨以此文,聊表感叹,也会分享很多我的Java学习 ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- 八数码问题:C++广度搜索实现
毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...
- 如何快速上手一个新技术之vue学习经验
碰到紧急项目挪别人的vue项目过来直接改,但是vue是18年初看过一遍,18年底再来用,早就忘到九霄云外了,结果丢脸的从打开vue开始学,虽然之前在有道云笔记做了很多记录,然后没有系统整理.所以借这次 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- 我个人的Java学习经验(一家之言)
声明:本文只是我的个人经验之谈,或者连经验之谈都算不上,因为我觉得自己还是个新手,没有什么经验可谈,就算是我分享一下自己从开始学习Java到现在的一些心路历程吧,各位看官暂且看吧,欢迎交流.第一部分算 ...
- 从零基础到拿到网易Java实习offer,谈谈我的学习经验
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
随机推荐
- c# 动态绘制直线和曲线
c# 动态绘制直线和曲线 在本案例中利用Graphics对象动态地绘制直线和曲线.程序运行后,选择“直线”单选按钮,然后按下鼠标左键拖动鼠标就可以绘制直线,选择“曲线”单选按钮,然后移动鼠标就可以 ...
- Lucene的基本使用
1.了解搜索技术 2.搜索引擎的原理 索引:类似于书的目录 3.实现搜索技术的方式 方式1:数据库搜索 利用SQL语句进行模糊搜索: select * from items where title l ...
- Beautiful Soup库基础用法(爬虫)
初识Beautiful Soup 官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/# 中文文档:https://www.crumm ...
- 如何增加黑客通过ssh入侵的难度--保护ssh的三把锁
源文档:https://blog.csdn.net/cnbird2008/article/details/6130696 简介 如果需要远程访问计算机并启用了 Secure Shell (SSH) 连 ...
- Android之listview添加数据篇
一.ListView: 1. ListView通常有两个职责: 1.向布局填充数据 2.处理选择点击等操作 2.ListView的创建需要3个元素: 1. ListView中的每一列的View. 2. ...
- FastCGI点滴
FastCGI是一种二进制协议,用于将交互式程序与Web服务器连接.它是早期通用网关接口(CGI)的变体.FastCGI的主要目标是减少与Web服务器和CGI程序之间的接口相关的开销,允许服务器每单位 ...
- servlet cdi analysis
CDI中最令人兴奋的功能是允许每个人在Java EE平台中编写强大的扩展性功能,甚至于改变其核心本身.这些扩展性功能是可以完全移植到任何支持CDI的环境中. CDI的一些主要特性 1.类型安全:CDI ...
- 基于CentOS搭建个人Leanote云笔记本
Leanote 依赖 MongoDB 作为数据存储,下面开始安装MongoDB: 1. 下载启动 MongoDB 下载 MongoDB 进入 /home 目录,并下载 MongoDB: cd /hom ...
- Excel宏录制、数据透视表、合并多个页签
前段时间做数据分析的时候,遇到很多报表文件需要处理,在此期间学习了很多Excel操作,特此做笔记回顾. Excel宏录制 打开开发者工具 打开Excel文件,选择”文件”-->“选项”--> ...
- centos 支持安装libsodium
yum install epel-release -y yum install libsodium -y 然后没了.