c++ 广度优先搜索(宽搜)
c++ bfs基本应用
Knight Moves
题目描述
贝茜和她的表妹在玩一个简化版的国际象棋。棋盘如图所示:

贝茜和表妹各有一颗棋子。棋子每次移一步,且棋子只能往如图所示的八个方向移动。比赛的规则很简单,两个人需要从起点将棋子移到终点,谁能花最少的步数从起点走到终点,就是赢家。
为了确保能赢表妹,贝茜希望每次都能算出最少的步数,你能帮助她么?
输入
输入起点和终点,用一个空格隔开。(确保起点一定能走到终点)
输出
输入最少的步数。
样例输入
a1 b2
样例输出
4
上代码:
AC代码
#include <bits/stdc++.h>
using namespace std;
struct Point
{
int x,y,step;
};
Point q[1000000],s,t;//t是终点,s是起点
int dx[8]={1,-1,1,-1,2,2,-2,-2};//dx[] + dy[] 代表Knight走的8个方向可达的点
int dy[8]={2,2,-2,-2,1,-1,1,-1};
int f=1,e=0;
int main()
{
char ca,cb,cc,cd;
scanf("%c%c %c%c",&ca,&cb,&cc,&cd);//输入
s.x=ca-'a'+1,s.y=cb-'1'+1;s.step=0;//把a转换成数字1 把字符1转换成数字1
t.x=cc-'a'+1,t.y=cd-'1'+1;t.step = 0;//把b转换成数字2 把字符2转换成数字2
if(s.x==t.x&&s.y==t.y)//如果起点等于终点,就直接退出
{
printf("0\n");
return 0;
}
e++;//队列入队时候的下标
q[e]=s;//q就是队列 把所有待查找的元素放在q队列里面 首先把第一个骑士s放在q队列里的第一个位置
////////////////////////////////开始宽搜////////////////////////////////////////////////
while(f<=e)//出队的下标不能大于入队时候的下标
{
Point u=q[f];//f是队列出队时候的下标 //* u是在队列中选定的骑士 *//////////////注意!!!!!!!此处下标为f!!!!!!!!!///
for(int i=0;i<8;i++)//for循环为了能 加上dx[] 和dy[]
{
Point v;//v是有效的骑士
v.x = u.x + dx[i],v.y = u.y + dy[i],v.step=u.step + 1;//把选定的位置向8个方向扩展(一次)
if(v.x<1||v.x>8||v.y<1||v.y>8)continue;//如果这个骑士的位置不在棋盘上,则丢弃
if(t.x==v.x&&t.y==v.y)//找到了终点
{
printf("%d\n",v.step);//输出步数
return 0;
}
e++;// 把入队下标 + 1
q[e]=v;// 入队
}
f++;//出队下标 + 1
}
return 0;
}
BFS思路总结:
step1:先找出所有符合规则的数,通过走棋规则和棋盘的边界来过滤
step2:将有效的数入队,入队的同时进行比较是否达到终点
step3:最后输出走到终点时的step
c++ 广度优先搜索(宽搜)的更多相关文章
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- 【宽搜】Vijos P1360 八数码问题
题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...
- 【宽搜】Vijos P1206 CoVH之再破难关
题目链接: https://vijos.org/p/1206 题目大意: 给你开始和结束两张4x4的01图,每次操作只能够交换相邻的两个格子(有公共边),问最少的操作步数. 题目思路: [搜索] 这题 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- js图的数据结构处理----邻链表,广度优先搜索,最小路径,深度优先搜索,探索时间拓扑
//邻居连表 //先加入各顶点,然后加入边 //队列 var Queue = (function(){ var item = new WeakMap(); class Queue{ construct ...
- 地牢逃脱(BFS(广度优先搜索))
题目描述 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一 ...
- 广度优先搜索--POJ迷宫问题
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...
随机推荐
- WPF Binding Path妙用
<Window x:Class="XamlTest.Window9" xmlns="http://schemas.microsoft.com/winf ...
- jquery多条件选择器
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 运行control userpasswords2实现winXP自动登录
原文:运行control userpasswords2实现winXP自动登录 如果你的计算机只是自己一人在用,且每次都用同一个用户名(或者你根本没在意过什么是用户名),而每次都要输入密码,是否太麻烦了 ...
- dataGrid 源更新 事件
DataGrid myGrid = new DataGrid(); CollectionView myCollectionView = (CollectionView)CollectionViewSo ...
- WPF如何判断PNG中的点是透明的
最近想用WPF做个空战游戏,其中就要解决子弹是否击中飞机的问题.这里面飞机用了PNG图片,大家都知道飞机是不规则图案,如何判断子弹碰撞成了一个难题. 好在我在网上找到了一个可以获取bitmap像素点颜 ...
- SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)
原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 " ...
- 微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API
原文:微信小程序把玩(三十一)wx.uploadFile(object), wx.downloadFile(object) API 反正我是没有测通这两个API!!!!不知道用的方式不对还是其他的!! ...
- NAudio的使用说明
官方网站:http://naudio.codeplex.com/ 源码:https://github.com/naudio/NAudio NuGet安装: Install-Package NAudio ...
- redis入门笔记(3)
本篇文章介绍几个redis的应用场景. 1.取最新N个数据的操作 –比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数 ...
- GitLab一键式安装bitnami 专题
git lab developer角色不能提交到master分支的问题 错误提示: git -c diff.mnemonicprefix=false -c core.quotepath=false p ...