Problem Description
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.
题意:给你两个坐标求棋子马过去的最少步数;
解题思路:最短路径问题,有新意的地方就是不再是上下左右走,而是跳马,八个方向用广搜,第一个搜到的就是最短路径;
感悟:一道中规中矩的题;
代码:
#include

#include

#include

#include

#define maxn 10

using namespace std;

int
dir[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};

int visit[maxn][maxn];

int check(int a,int b)

{

   
if(a<1||a>8||b<1||b>8||visit[a][b])

       
return 1;

    else

       
return 0;

}

struct node

{

    int
x,y;

    int
times;

}start,fr,a;

int bfs(int sx,int sy,int x,int y)

{

   
memset(visit,0,sizeof(visit));

    queue
Q;

   
start.x=sx;

   
start.y=sy;

   
start.times=0;

   
visit[start.x][start.y]=1;

   
Q.push(start);

   
while(!Q.empty())

    {

       
fr=Q.front();

       
Q.pop();

       
//cout<<"x="<<x<<"
"<<"y="<<y<<endl;

       
if(fr.x==x&&fr.y==y)

           
return fr.times;

       
for(int i=0;i<8;i++)

       
{

           
a.x=fr.x+dir[i][0];

           
a.y=fr.y+dir[i][1];

           
if(check(a.x,a.y))

               
continue;

           
a.times=fr.times+1;

           
visit[a.x][a.y]=1;

           
Q.push(a);

       
}

    }


}

int main()

{

   
//freopen("in.txt", "r", stdin);

    char
a,b;

    int
sx,sy,x,y;

   
while(~scanf("%c%d %c%d\n",&a,&sy,&b,&y))

    {

       
//cout<<"sx="<<a<<endl;

       
//cout<<"sy="<<sy<<endl;

       
//cout<<"x="<<b<<endl;

       
//cout<<"y="<<y<<endl;

       
sx=a-'a'+1;

       
x=b-'a'+1;

       
//坐标转化成数字

       
int ans=bfs(sx,sy,x,y);

       
printf("To get from %c%d to %c%d takes %d knight
moves.\n",a,sy,b,y,ans);

    }

    return
0;

}


Knight Moves的更多相关文章

  1. Knight Moves

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

  2. HDU 1372 Knight Moves

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

  3. [宽度优先搜索] HDU 1372 Knight Moves

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  4. HDU 1372 Knight Moves (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...

  5. UVA 439 Knight Moves --DFS or BFS

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

  6. 【POJ 2243】Knight Moves

    题 Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are ...

  7. hdu Knight Moves

    这道题实到bfs的题目,很简单,不过搜索的方向变成8个而已,对于不会下象棋的会有点晕. #include <iostream> #include <stdio.h> #incl ...

  8. HDU 1372 (搜索方向稍有改变) Knight Moves

    其实手写模拟一个队列也挺简单的,尤其是熟练以后. 尼玛,这题欺负我不懂国际象棋,后来百度了下,国际象棋里骑士的走法就是中国象棋里面的马 所以搜索就有八个方向 对了注意初始化标记数组的时候,不要把起点标 ...

  9. HDU 1372 Knight Moves【BFS】

    题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...

  10. UVA 439 Knight Moves

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

随机推荐

  1. NSTimer、CADisplayLink 内存泄漏

    NSTimer.CADisplayLink 内存泄漏 内存泄漏的原因 CADisplayLink 要用 Taget 和 Selector 初始化,NSTimer 也可以用类似的方法初始化.这样初始化之 ...

  2. [C#]关于DBNULL的解释

    1   概述 如下例子,你觉得有什么问题?如你能很快的找出问题,并且解决它,那么你可以跳过本篇文章,谢谢~~. List<Base_Employee> ltPI = new List< ...

  3. Linux - 设置/取消代理

    export http_proxy=118.210.42.251:44367 或: export https_proxy=118.210.42.251:44367   要取消该设置: unset ht ...

  4. 在Ubuntu上安装arm-linux-gcc的问题

    由于之前将Ubuntu的更新关掉了,所以导致我下载32位兼容包一直出错. 在arm-linux-gcc 安装之后,还不能编译程序的话,首先看自己的系统是多少位的,因为网上大部分的安装包都是32位的,所 ...

  5. poj1006中国剩余定理

    Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103506   Accepted: 31995 Des ...

  6. qplot函数用法(转载)

    http://blog.csdn.net/u014801157/article/details/24372499 写的很全面 放在这里记录下

  7. 神奇的版本库—————GIT

    表示是第一次接触这个东东,然后疯狂百度了一波资料,然而=-=,完全不敢相信居然百度出了,GIT是全球最大同性交友网站...... 简直有点毁三观呐..好吧,其实按道理来说,这么解释也没有错欸,官方说明 ...

  8. C#泛型基础知识点总结

    1.0  什么是泛型 泛型是C#2.0和CLR(公共语言运行时)升级的一个新特性,泛型为.NET 框架引入了一个叫 type parameters(类型参数)的概念,type parameters 使 ...

  9. 虚拟机中ubuntu-16.04 Linux系统下配置mysql数据库,并在windows下使用navicat远程连接

    Linux系统下mysql数据库安装配置步骤: 1.在服务器上安装mysql:sudo apt-get install mysql-server sudo apt-get install mysql- ...

  10. myeclipse 中clean的作用

    myeclipse中clean的作用     重新编译的功能 就是将编译好的class文件都删除后在重新生成.如果引用的jar包不能工作可以尝试下.