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.

HINT

解决思路就是利用一个BFS(Breadth_First_Search)遍历。

思路梳理:

  1. BFS的应用场景有两个:

    • 层序遍历
    • 求无权图单源最短路径
  2. BFS为何可以求得无权图的最短路?

    BFS的算法思想和二叉树的层序遍历类似,利用队列来处理,每一次出队首元素的时候就将队首元素的最近的结点或者距离为一个步长的结点拉入队列。因此如果在这个过程中我们将入队的元素都赋给他们自己的层号,那么层号就是从出发点到目的地的最短路径。结合下面图片来理解(图片来自《大话数据结构(点击下载)》):

  1. 对于这个题目如何利用BFS来解决?

    BFS处理的是图的遍历,要使用BFS就要将题目中的棋盘转化为图。这里将当前马所在的位置看作一个结点,马可以从这个点走一步所到达的地方就是它所连接的几个结点。那么连接的几个结点的层号就是原来位置的层号+1 。

Accepted

#include <bits/stdc++.h>
using namespace std;
pair<int,int>Next[] = { {1,2},{2,1},{-1,-2},{-2,-1},{1,-2},{2,-1},{-1,2},{-2,1} }; //将所有可能的坐标位置先写出来
int main() {
string s1, s2; //保存其实和重视位置
while (cin >> s1 >> s2) {
pair<int, int>temp;
queue<pair<int, int>>Q; //用于BFS遍历的数组
int vis[8][8] = { 0 }; //标记是否访问,如果为访问那么为0或者是起始位置,否则为其到起始点的距离
pair<int, int>a = { (int)(s1.front() - 'a'),(int)(s1.back() - '0')-1 }; //保存其实坐标
pair<int, int>b = { (int)(s2.front() - 'a'),(int)(s2.back() - '0')-1 }; //保存目的地
Q.push(a);vis[a.first][a.second] = 0; //将起始地入队,并标记访问
while (!Q.empty()) {
temp = Q.front(); Q.pop(); //保存并出队
if (temp == b)break; //如果是目的地,那么结束循环
for (int i = 0;i < 8;i++) { //否则,找到它的可能走到的坐标,也就是与他相连的结点
int x = temp.first + Next[i].first; //计算横坐标
int y = temp.second + Next[i].second; //计算纵坐标
pair<int, int>t = { x,y };
if (x > -1 && y > -1 && x < 8 && y < 8 && !vis[x][y]&&t!=a) { //如果坐标没有越界,并且不是起始点
Q.push(t);vis[x][y] = vis[temp.first][temp.second] + 1; //入队,并且标记到起始点的距离
}
}
}
cout << "To get from " << s1 << " to " << s2 << " takes " << vis[b.first][b.second] << " knight moves." << endl;//输出结果
}
}

Knight Moves UVA - 439的更多相关文章

  1. UVA 439 Knight Moves(BFS)

    Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...

  2. UVA 439 Knight Moves --DFS or BFS

    简单搜索,我这里用的是dfs,由于棋盘只有8x8这么大,于是想到dfs应该可以过,后来由于边界的问题,TLE了,改了边界才AC. 这道题的收获就是知道了有些时候dfs没有特定的边界的时候要自己设置一个 ...

  3. UVA 439 Knight Moves

      // 题意:输入标准国际象棋棋盘上的两个格子,求马最少需要多少步从起点跳到终点 BFS求最短路: bfs并维护距离状态cnt, vis记录是否访问过 #include<cstdio> ...

  4. 【UVa】439 Knight Moves(dfs)

    题目 题目     分析 没有估价函数的IDA......     代码 #include <cstdio> #include <cstring> #include <a ...

  5. uva 439 Knight Moves 骑士移动

    这道题曾经写过,bfs.用队列,不多说了,上代码: #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  6. UVA Knight Moves

    题目例如以下: Knight Moves  A friend of you is doing research on the Traveling Knight Problem (TKP) where ...

  7. UVa 439骑士的移动(BFS)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. Knight Moves

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  9. HDU 1372 Knight Moves

    最近在学习广搜  这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...

随机推荐

  1. 基于tcp的应用层消息边界如何定义

    聊聊基于tcp的应用层消息边界如何定义 背景 2018年笔者有幸接触一个项目要用到长连接实现云端到设备端消息推送,所以借机了解过相关的内容,最终是通过rabbitmq+mqtt实现了相关功能,同时在心 ...

  2. ImportError: No module named _ssl解决方法

    import ssl时出现ImportError: No module named _ssl错误是因为咱安装Python的时候没有把ssl模块编译进去导致的. 解决步骤: 系统没有openssl,手动 ...

  3. Elasticsearch--Logstash定时同步MySQL数据到Elasticsearch

    新地址体验:http://www.zhouhong.icu/post/139 一.Logstash介绍 Logstash是elastic技术栈中的一个技术.它是一个数据采集引擎,可以从数据库采集数据到 ...

  4. iOS 14.5 有啥新功能?Apple Watch 也能解锁 iPhone 了

    转: iOS 14.5 有啥新功能?Apple Watch 也能解锁 iPhone 了 苹果今天发布了即将发布的 iOS 14.5 和 iPadOS 14.5 更新的第一个 Beta 版本,我们在其中 ...

  5. 在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管

    在不使用外延层的同轴半绝缘衬底材料上制作4H-SIC横向双重注入金属氧化物半导体场效应晶体管 杂志:日本应用物理杂志   在不使用外延层在同轴的半绝缘SIC衬底上制作4H-SIC横向双重注入金属氧化物 ...

  6. 洛谷 P4747 [CERC2017]Intrinsic Interval 线段树维护连续区间

    题目描述 题目传送门 分析 考虑对于 \([l,r]\),如何求出包住它的长度最短的好区间 做法就是用一个指针从 \(r\) 向右扫,每次查询以当前指针为右端点的最短的能包住 \([l,r]\) 的好 ...

  7. java基础知识 + 常见面试题

    准备校招面试之Java篇 一. Java SE 部分 1.1 Java基础 1. 请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的? Object 的 hash ...

  8. springboot源码解析-管中窥豹系列之EnableXXX(十)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  9. cve-2018-2893 weblogic -WLS核心组件反序列化

    漏洞分析 https://www.freebuf.com/column/178103.html https://www.freebuf.com/vuls/177868.html 攻击者可以在未授权的情 ...

  10. C# 应用 - 多线程 1) 多线程的知识图谱