宽搜 c语言,c++ 广度优先搜索(宽搜)

c++ bfs基本应用

Knight Moves

题目描述

贝茜和她的表妹在玩一个简化版的国际象棋。棋盘如图所示:

02c22c8c954cb9e711c891bbdd52989d.png 贝茜和表妹各有一颗棋子。棋子每次移一步,且棋子只能往如图所示的八个方向移动。比赛的规则很简单,两个人需要从起点将棋子移到终点,谁能花最少的步数从起点走到终点,就是赢家。 为了确保能赢表妹,贝茜希望每次都能算出最少的步数,你能帮助她么?

输入

输入起点和终点,用一个空格隔开。(确保起点一定能走到终点)

输出

输入最少的步数。

样例输入

a1 b2

样例输出

4

上代码:

AC代码

#include

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

原文出处:https://www.cnblogs.com/LJA001162/p/11183692.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
广度优先搜索算法(BFS)是一种图论的经典算法,用于解决图的遍历问题。在广度优先搜索中,从给定的起始顶点开始,逐层地向外扩展,先访问距离起始顶点最近的顶点,再访问距离起始顶点稍远一点的顶点,以此类推,直到访问完所有可达的顶点。 在引用的代码中,作者使用C语言实现广度优先搜索算法。代码中使用了一个二维向量`tree`来表示图,`flag`数组用于记录索到了节点i的第几个节点,`M`队列用于存储待访问的节点。算法通过不断从队列中取出节点,并将其相邻的节点加入队列中,直到队列为空为止。 具体的实现步骤如下: 1. 声明一个二维向量`tree`,用于表示图。在代码中,将图中的节点数设为9,通过循环生成树的结构。 2. 初始化数组`flag`,用于记录索到了节点i的第几个节点。 3. 声明一个队列`M`,用于存储待访问的节点。 4. 将起始节点加入队列`M`中。 5. 开始广度优先搜索算法: - 从队列`M`中取出第一个节点,并输出该节点。 - 遍历该节点的相邻节点,将其加入队列`M`中。 - 如果队列`M`不为空,继续执行上述步骤。 6. 输出结束。 以上是广度优先搜索算法的C语言实现示例。你可以参考这段代码来理解和使用广度优先搜索算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++广度优先搜索一本通习题](https://download.csdn.net/download/m0_54615144/86269542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [广度优先搜索算法(附C++实现)](https://blog.csdn.net/m0_37772174/article/details/81188732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值