马的移动(BFS) 详细注释 一个具有情怀的题目
题目描述
小明很喜欢下国际象棋,一天,他拿着国际象棋中的“马”时突然想到一个问题:
给定两个棋盘上的方格a和b,马从a跳到b最少需要多少步?
现请你编程解决这个问题。
提示:国际象棋棋盘为8格*8格,马的走子规则为,每步棋先横走或直走一格,然后再往外斜走一格。
输入格式
输入包含多组测试数据。每组输入由两个方格组成,每个方格包含一个小写字母(a~h),表示棋盘的列号,和一个整数(1~8),表示棋盘的行号。
输出
对于每组输入,输出一行“To get from xx to yy takes n knight moves.”。
样例输入
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
样例输出
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.
我的搜索第一题
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step;
};
int vis[8][8];//8X8储存棋盘
int sx,sy,ex,ey,ans;
int to[8][2]={-1,-2,-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2};
//第一个8对应的是马的8种移动情况
//第二个2代表的是ch1横坐标和纵坐标变化时对应的数值
int check(int x,int y)
{
if(x<0 || y<0 || x>=8 || y>=8)//超出了棋盘的范围
return 1;//超出范围,返回1
if(vis[x][y])//非0为真 ,此处为检验该位置是否之前已经用过
return 1;//该位置以前使用过,返回1
return 0;//该位置没有超出范围且没有用过,返回0
}
void bfs()//void结尾不需要return
{
int i;
queue<node> Q;//队列容器
node a,next;//a和next变成结构体头
a.x = sx;//ch1横坐标
a.y = sy;//ch1纵坐标
a.step = 0;// 目前ch1的坐标变化步骤为0
vis[sx][sy] = 1;//将ch1目前坐标的位置的数值标志为1
Q.push(a);//将a整个扔进去,Q是node类型,只能向其中添加node类型的元素,
//node类型看作一个元素而一个node元素又包含其他的元素
while(!Q.empty())//若Q不空则运行
{
a = Q.front();//返回第一个元素,队顶元素
//访问queue队首元素,如例:q.front(),即最早被压入队列的元素
Q.pop();//弹出Q中的第一个元素,并且不会返回数值(出队)
if(a.x == ex && a.y == ey)//ch1是否到达ch2的坐标
{
ans = a.step;//把当前的步骤数赋给ans
}
for(i = 0;i<8;i++)
{
next = a;//pop已经弹出上一个队顶元素,现在是下一个
next.x+=to[i][0];//ch1的横坐标的变化
next.y+=to[i][1];//ch1的纵坐标的变化
if(check(next.x,next.y))//调用上面的实参函数check
continue;//如果返回为1,跳出本次循环,后面三步骤跳过
next.step = a.step+1;//目前进行过的步骤次数+1
vis[next.x][next.y] = 1;//将该位置变更状态为已经使用过的位置
Q.push(next);//将next整个扔进队列里面
}
}
return ;
}
int main()
{
char ch1[10],ch2[10];
while(~scanf("%s%s",ch1,ch2))//等价于!=EOF
{
//ASCII码
sx = ch1[0]-'a';//ch1横坐标
sy = ch1[1]-'1';//ch1纵坐标
ex = ch2[0]-'a';//ch2横坐标
ey = ch2[1]-'1';//ch2纵坐标
memset(vis,0,sizeof(vis));//将vis数组整个清零
bfs();//调用bfs函数
printf("To get from %s to %s takes %d knight moves.\n",ch1,ch2,ans);
}
return 0;
}
马的移动(BFS) 详细注释 一个具有情怀的题目的更多相关文章
- Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...
- 一套强大的vim配置文件+详细注释
phpchina折腾王独家配置,灰常牛叉的一套vim配置,另附有详细注释,自己折腾vim的时候可以参照其中的大部分设置进行一些个性化定制."是否兼容VI,compatible为兼容,noco ...
- codevs 2924 数独挑战 x(三种做法+超详细注释~)
2924 数独挑战 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题目描述 Description “芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今 ...
- [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...
- C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式
C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...
- X86汇编——计算斐波那契数列程序(详细注释和流程图说明)
X86汇编实现斐波那契数列 程序说明: 输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字 因为存结果是A ...
- 经典剪枝算法的例题——Sticks详细注释版
这题听说是道十分经典的剪枝算的题目,不要问我剪枝是什么,我也不知道,反正我只知道用到了深度搜索 我参考了好多资料才悟懂,然后我发现网上的那些大神原理讲的很明白,但代码没多少注释,看的很懵X,于是我抄起 ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- MFC的PNG贴图按钮类(详细注释)
MFC的PNG贴图按钮类(详细注释) (转载请注明出处) 作者:梦镜谷雨 萌新第二次写帖子,请多多包涵.末尾附上相应代码(PS公司繁体系统所以部分注释繁体请别介意). 因自带控件不美观,于是网上参考学 ...
随机推荐
- PC端QT源码编译
转载:http://blog.sina.com.cn/s/blog_c2b97b1d01016x1i.html 1.下载源码(前面已经提到了) 选择合适自己的源码. 先用"uname -a& ...
- 数据库 MySQL 之 表操作、存储引擎
数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名( 字段名1 ...
- MVC 知识点随笔
1.https://msdn.microsoft.com/zh-cn/gg981918 <text></text> 等同于 @:
- App测试从入门到精通之功能测试
App的功能测试指的是针对软件需求以及用户要求针对APP功能进行测试.简单点理解就是保证App功能的正确性,不要系统出现Bug.让用户用户的舒服,用的爽!好了,我们看下关于App的功能测试要点有哪些? ...
- 编写高质量代码改善C#程序的157个建议——建议46:显式释放资源需继承接口IDisposable
建议46:显式释放资源需继承接口IDisposable C#中的每一个类型都代表一种资源,资源分为两类: 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源:不受CLR ...
- MongoDB整理笔记の增加节点
MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...
- C# worksheet设置Excel样式
1.例子导出Excel的样式 样式代码 public void Exportdatagridviewtoexcel(string Textname) { SaveFileDialog savedial ...
- WinForm中自定义搜索框(水印、清空按钮、加载中图标)
public partial class CustomSearchBar : TextBox { private readonly Label lblwaterText = new Label(); ...
- .NET平台的资源文件管理
可以管理文本.图片等不同类型的资源 管理方式(增删改) 可以直接修改XXX.resx源文件(XML格式,文本直接管理内容,图片需要指定路径,资源名和图片名可以不同) 也可以在VS的可视化界面上进行操作 ...
- cinder侧卸载卷流程分析
cinder侧卸载卷分析,存储类型以lvm+iscsi的方式为分析基础在虚机卸载卷的过程中,主要涉及如下三个函数1)cinder.volume.api.begin_detaching 把volume的 ...