c++ 广度优先搜索(宽搜)
2024-08-29 10:48:49
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
最新文章
- 分享一个单点登录、OAuth2.0授权系统源码(SimpleSSO)
- lambda表达式
- [ACM_动态规划] Alignment (将军排队)
- Arduino101学习笔记(七)&mdash;&mdash; 时间API
- codeforces B. Making Sequences is Fun 解题报告
- Fishnet(暴力POJ 1408)
- PAT乙级真题1001. 害死人不偿命的(3n+1)猜想 (15)(解题)
- ios开发之网络基础
- Linux Vi的使用
- css中文本框与按钮对不齐解决方案
- [学习心得][Introduction to ASP.NET Core 1.0]3-2 ASP.NET Core and MVC Pattern
- 在centos7中手动编译greenplum
- sublime text如何保存为uft-8无bom编码格式文件
- Redis数据结构之intset
- webpack.config.js配置遇到Error: Cannot find module &#39;@babel/core&#39;&;&;Cannot find module &#39;@babel/plugin-transform-react-jsx&#39; 问题
- 【webstorm】注册码 更新笔记
- [Paper] LCS: An Efficient Data Eviction Strategy for Spark
- 辅助测试工具xip.io
- c# 快速排序法并记录数组索引
- beta2
热门文章
- jquery trim()的用法
- ubuntu16.04安装搜狗输入法
- xcode缓存清理
- SQL Server 可更新订阅中有行筛选的同步复制移除项目而不重新初始化所有订阅!
- Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good
- ORACLE 错误 ora-01830 解决方法
- js判断图片是否存在
- 快速搭建多线程Windows服务解决方案
- Tensorflow数据读取机制
- Delphi 7.0常用函数速查手册(磁盘文件类)