O - 上一个题的加强版

Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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 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.
题目大意:这道题是建立在poj2488的基础上的,我们已经知道了knight的移动规则,这道题是给了你起点和终点的位置坐标,问你从起点到终点所需要的最小步数。
思路分析:我的第一直觉就是使用bfs,bfs的实现主要是依靠队列来进行实现 ,这时候队列中元素的类型就显得犹为重要,这在我看来是使用bfs所必须要首先考虑
的问题,对于本题而言,在进行bfs时所需要记录的一个是x,一个是y,还有一个是step,所以我选择了结构体类型,如果需要记录的只有两个元素的话使用pair类型
也是可以的:还要有两点需要注意一下,一个是输出格式,一定要一致,否则会一wa到底,另外一个就是题目说明有多组测试实例,在输出一组答案后一定记得把队列
清空,否则会出现错误。
代码:#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
int maps[10][10];
int f[8][2]={{-2,-1},{-2,1},{-1,2},{-1,-2},{1,2},{1,-2},{2,-1},{2,1}};
struct nod
{
    int x;
    int y;
    int step;
};
queue<nod> bfs;
int main()
{
    char a,b;
    int c,d;
    while(cin>>a>>c>>b>>d)
    {
        nod m,n,p;
        memset(maps,0,sizeof(maps));
        int tx=b-'a',ty=d-1;
         m.x=a-'a',m.y=c-1,m.step=0;
         bfs.push(m);
        while(!bfs.empty())
        {
            p=bfs.front();
            if(p.x==tx&&p.y==ty)
            {
                printf("To get from %c%d to %c%d takes %d knight moves.\n",a,c,b,d,p.step);
                break;
            }
            for(int i=0;i<8;i++)
            {
                n.x=p.x+f[i][0];
                n.y=p.y+f[i][1];
                n.step=p.step+1;
                if(n.x>=0&&n.x<=7&&n.y>=0&&n.y<=7&&!maps[n.x][n.y])
                {
                    maps[n.x][n.y]=1;
                    bfs.push(n);
                }
            }
            bfs.pop();
        }
        while(!bfs.empty())
        {
            bfs.pop();
        }
    }
    return 0;
}
奋斗!前进!

poj2243 bfs的更多相关文章

  1. poj2243 Knight Moves(BFS)

    题目链接 http://poj.org/problem?id=2243 题意 输入8*8国际象棋棋盘上的两颗棋子(a~h表示列,1~8表示行),求马从一颗棋子跳到另一颗棋子需要的最短路径. 思路 使用 ...

  2. poj2243 &amp;&amp; hdu1372 Knight Moves(BFS)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接: POJ:http: ...

  3. 跳马(Knight Moves), ZOJ1091, POJ2243 x

    跳马(Knight Moves), ZOJ1091, POJ2243 题目描述: 给定象棋棋盘上两个位置 a 和 b,编写程序,计算马从位置 a 跳到位置 b 所需步数的最小值. 输入描述: 输入文件 ...

  4. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  5. 【BZOJ-1656】The Grove 树木 BFS + 射线法

    1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 186  Solved: 118[Su ...

  6. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  7. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  8. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  9. Sicily 1048: Inverso(BFS)

    题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...

随机推荐

  1. js中完数的输出

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. PAT 65. A+B and C (64bit) (20)

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1065 思路分析: 1)对a+b造成的long long 类型的数据溢出进行特殊处理: a> ...

  3. 用document.onreadystatechange和document.readyState确保文档加载完毕才获取DOM

    document.onreadystatechange = function(){ //document.readyState有“interactive”和“complate”两个值 if(docum ...

  4. 修补--Redis未授权访问漏洞

    --------------------------------阿里云解决方案----------------------------------- 一.漏洞描述 Redis因配置不当可以导致未授权访 ...

  5. C 中va_list,va_arg,va_start,va_end usage

    1.在学习c语言,难免会遇到多参函数,刚好c中也提供了一些机制:宏函数 #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first h ...

  6. Angular2 和TypeScript

    Angular2 和TypeScript 原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者: ...

  7. 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记

    前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...

  8. document.body.scrollTop vs document.documentElement.scrollTop && document.body.scrollHeight vs document.documentElement.scrollHeight

    FireFox下 document.body.scrollHeight || document.documentElement.scrollHeight;//等价 document.body.scro ...

  9. BZOJ 1017 魔兽地图DotR(树形DP)

    题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...

  10. Linux 日志

    成功地管理任何系统的关键之一,是要知道系统中正在发生什么事.Linux 中提供了异常日志,并且日志的细节是可配置的. Linux 日志都以明文形式存储,所以您不需要特殊的工具就可以搜索和阅读它们.您还 ...