学习经验记录与分享——

最近在学习中接触到了一种解决最短路径的实用方法----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(广度搜索)学习经验总结的更多相关文章

  1. 分享记录我的Linux系统入门学习经验

    人生很多事情都是巧合,或者说命中注定.就拿Linux于我来说,大学期间也修了Linux基础这门课,但是从来没有想到自己会从事与Linux相关的工作,更没有想过自己可以通过Linux获取更多的东西. 真 ...

  2. 修道士与野人问题(BFS广度搜索)

    #include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { i ...

  3. 从技术小白到收获BAT研发offer,分享我的学习经验和感悟(赠送相关学习资料)

    去年秋季参加了校园招聘,有幸拿到了BAT.头条.网易.滴滴.亚马逊.华为等offer,经过研究生两年的学习积累,终于达成了自己的目标,期间也经历了很多,谨以此文,聊表感叹,也会分享很多我的Java学习 ...

  4. 算法竞赛——BFS广度优先搜索

    BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...

  5. 八数码问题:C++广度搜索实现

    毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...

  6. 如何快速上手一个新技术之vue学习经验

    碰到紧急项目挪别人的vue项目过来直接改,但是vue是18年初看过一遍,18年底再来用,早就忘到九霄云外了,结果丢脸的从打开vue开始学,虽然之前在有道云笔记做了很多记录,然后没有系统整理.所以借这次 ...

  7. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  8. 我个人的Java学习经验(一家之言)

    声明:本文只是我的个人经验之谈,或者连经验之谈都算不上,因为我觉得自己还是个新手,没有什么经验可谈,就算是我分享一下自己从开始学习Java到现在的一些心路历程吧,各位看官暂且看吧,欢迎交流.第一部分算 ...

  9. 从零基础到拿到网易Java实习offer,谈谈我的学习经验

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

随机推荐

  1. JavaScript 快速排序详解

    使用的是<JavaScript数据结构与算法>一书中的快速排序,并加上自己的理解. 经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性 ...

  2. oracle-logminer

    LogMiner工具实际上是由两个新的PL/SQL内建包((DBMS_LOGMNR 和 DBMS_ LOGMNR_D)和四个V$动态性能视图(视图是在利用过程DBMS_LOGMNR.START_LOG ...

  3. 虚拟机安装及配置(centOs7)

    准备工作 a)下载VMware workstation14 b)下载CentOS7 CentOS7 c)下载xshell.xftp 安装参考 分区设置 补充(解决网络IP问题,设置IP,service ...

  4. Linux tmpwatch命令详解

    Linux tmpwatch命令 Linux tmpwatch命令用于删除暂存文件. 执行tmpwatch指令可删除不必要的暂存文件,您可以设置文件超期时间,单位以小时计算 用法: tmpwatch ...

  5. <realsense D400>同步采集深度图和彩色图

    利用深度相机采集深度图和彩色图会面临一个问题,如何实现同步采集数据? 以下是我搜集到的两点方法: 1)高翔博士提到他的orbslam2教程有这么一步工作,具体目录为 example/RGBD/. (等 ...

  6. onOptionsItemSelected、onMenuItemSelected、onContextItemSelected 区别

         1.在点击选项菜单(OptionsMenu:点击menu弹出的菜单)的菜单项时即调用了onMenuItemSelected 也调用了onOptionsItemSelected ,于是疑惑他们 ...

  7. C++Primer第五版——习题答案详解(七)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第8章 IO库 练习8.1 istream &iofunc(istream &a ...

  8. 涂抹mysql笔记-InnoDB/MyISAM及其它各种存储引擎

    存储引擎:一种设计的存取和处理方式.为不同访问特点的表对象指定不同的存储引擎,可以获取更高的性能和处理数据的灵活性.通常是.so文件,可以用mysql命令加载它. 查看当前mysql数据库支持的存储引 ...

  9. Docker系列08:容器监控

    1 监控解决方案 cadvisor+influxdb+grafana cAdvisor:Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储:它通过宿主机 ...

  10. Java笔试面试题整理第七波

    转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用     在Java中su ...