学习经验记录与分享——

最近在学习中接触到了一种解决最短路径的实用方法----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. Ubuntu16.04交叉工具链安装

    前言: 开发环境是64位的ubuntu16.04,交叉工具链是通过sudo apt-get install ....安装的,移植uboot2014.10,但是很奇怪,按照网上的介绍在start.s里面 ...

  2. Yii2项目高级模版 三个模块在同一个目录下的重定向配置

    最近做项目用到的,非常好用. 修改 advanced/backend/config/main.PHP 文件如下: return [ 'homeUrl' => '/admin', 'compone ...

  3. Spring的学习和源码的学习

    PS:Spring中有各种的Templeate,比如jdncTemplate,主要是为了避免各种模板的代码,抽象出来的 PS: @Configration.@Bean是用来替代xml那种解析方式 PS ...

  4. PythonStudy——如何使输出不换行

    python 3.x版本打印不换行格式如下: print(x, end="") # end="" 可使输出不换行.双引号之间的内容就是结束的内容, # 可以是空 ...

  5. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  6. ipc基础

    ipc对象持久性 进程持久性:具有这种持久性的对象在持有它的最后一个进程关闭了该对象为止 内核持久性:这种IPC对象一直存在直到内核重新自举或显示删除该对象为止 文件系统持久性:具有这种持久性的对象只 ...

  7. etcd和redis的比较和日常使用场景

    转自https://blog.csdn.net/weixin_41571449/article/details/79429511 个人观点:etcd的红火来源于kurbernetes用etcd做服务发 ...

  8. Anaconda安装python(idea兼容)

    官方网站www.anaconda.com 1 Windos安装 一路下一步,注意添加环境变量 成功过后,测试一下,打开cmd命令行 2 Linux安装 下载完成后上传到linux bash Anaco ...

  9. Eclipse Java EE IDE for Web Developers集成的Maven 3 指向自己安装的 Maven

    一.配置Maven环境 1.下载apache-maven文件,选择自己需要的版本,地址:Apache 官方下载地址是http://maven.apache.org/download.cgi 2.下载并 ...

  10. 虚拟机网络连接NAT模式,本地用Xshell连接

    当虚拟机centos6网络连接使用NAT模式时,因为共用宿主机ip所以当使用Xshell时直接填写虚拟机的ip地址和22端口是无法连接虚拟机的. 这样就需要配置端口映射关系! 1. 打开虚拟网络编辑器 ...