题目描述(翻译)

somurolov先生,精彩的象棋玩家。声称任何人他都可以从一个位置到另一个骑士这么快。你能打败他吗?

问题

你的任务是写一个程序来计算一个骑士达到从另一点所需要的最少步数,这样你就有机会被比somurolov。

对于不熟悉象棋的人,可能的骑士动作如图1所示。



输入

输入开始与一个单一的行本身的情况下。

下一步跟踪N个场景。每个场景由三行包含整数。第一行指定棋盘边的长度L(4 < L = < 300)。整个板尺寸L×L的第二和第三行包含整数对{ 0,…,L-1 } * { 0,…,L-1 }指定开始和结束位置的骑士。整数由一个空格隔开。您可以假定这些位置是该方案的棋盘上的有效位置.。

输出

对于输入的每一个场景,你必须计算从起点到终点的最小的骑士移动量.。如果起点和终点相等,距离为零。距离必须写在一行。

样例输入

3

8

0 0

7 0

100

0 0

30 50

10

1 1

1 1

样例输出

5

28

0

思路

典型的马走日的变种,只是将DFS改成了BFS而已

代码实现

#include<iostream>
#include<cstring>
using namespace std;
int head=0,tail=1,q,nextx,nexty,n,m,startx,starty,overx,overy;
int a[100005],b[100005],pre[100005],x[8]={-2,-1,1,2,2,1,-1,-2},y[8]={1,2,2,1,-1,-2,-2,-1},c;
bool mark[305][305];
void print(int d)
{
    if(pre[d]!=0)print(pre[d]);
    c++;
}
bool chek(int qx,int qy)
{
    if(qx<=m-1&&qy<=m-1&&qx>=0&&qy>=0)return 1;
    return 0;
}
void dfs()
{
    memset(mark,0,sizeof(mark));
    a[1]=startx;
    b[1]=starty;
    mark[startx][starty]=1;
    pre[1]=0;
    head=0;tail=1;
    while(head!=tail)
        {
            head++;
            for(int i=0;i<=7;i++)
            {
                nextx=a[head]+x[i];
                nexty=b[head]+y[i];
                if(!mark[nextx][nexty]&&chek(nextx,nexty))
                {
                    tail++;
                    a[tail]=nextx;
                    b[tail]=nexty;
                    pre[tail]=head;
                    mark[nextx][nexty]=1;
                    if(a[tail]==overx&&b[tail]==overy)
                    {
                        print(tail);
                        printf("%d\n",c-1);
                        return ;
                    }
                }
            }
        }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        c=0;
        scanf("%d",&m);
        scanf("%d%d%d%d",&startx,&starty,&overx,&overy);
        if(startx==overx&&starty==overy)
        {
            printf("0\n");
            continue;
        }
        dfs();
    }
}

[openjudge-搜索]Knight Moves(翻译与题解)的更多相关文章

  1. OpenJudge/Poj 1915 Knight Moves

    1.链接地址: http://bailian.openjudge.cn/practice/1915 http://poj.org/problem?id=1915 2.题目: 总Time Limit: ...

  2. POJ---2243 Knight Moves 使用A*算法的广度优先搜索

    题目链接:http://poj.org/problem?id=2243 启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省 ...

  3. HDU 1372 Knight Moves 题解

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

  4. 题解 UVA439 骑士的移动 Knight Moves

    前言 最近板子题刷多了-- 题意 一个 \(8\times 8\) 的棋盘,问马从起点到终点的最短步数为多少. \(\sf Solution\) 要求最短路径嘛,显然 bfs 更优. 读入 这个读入处 ...

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

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

  6. 杭州电 1372 Knight Moves(全站搜索模板称号)

    http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others)   ...

  7. hdu1372 Knight Moves BFS 搜索

    简单BFS题目 主要是读懂题意 和中国的象棋中马的走法一样,走日字型,共八个方向 我最初wa在初始化上了....以后多注意... 代码: #include <iostream> #incl ...

  8. Hdoj 1374.Knight Moves 题解

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

  9. UVA-439, Knight Moves(深度优先搜索)

    #include<iostream> #include<queue> #include<cstring> #include<string> #inclu ...

随机推荐

  1. Spring事务管理详解_基本原理_事务管理方式

    1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...

  2. python json 模块

    什么是json? json是返回的是字符串格式,把python数据类型列表.字典转换成json字符串格式, 这种格式java php 其他语言都可以认识的字符串,可以跨语言交流. json,用于字符串 ...

  3. OC UITextField只允许输入两位小数

    //只能输入两位小数 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range r ...

  4. windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式 Windows 检测到 EFI 系统分区格式化为 NTFS。将 EFI 系统分区个数化为 FAT32,然后重新启动安装

    win10安装问题解决 问题 1.windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式 解决方法: 1.bios,更改 uefi/legacy boot 为ueei only 后面可以安装了 ...

  5. 20165236 《Java程序设计》第七周学习总结

    20165236 <Java程序设计>第七周学习总结 教材学习内容总结 第十一章  JDBC与MySQL数据库 1.MySQL数据库管理系统: MySQL数据库管理系统,简称MySQL,是 ...

  6. synchronized的简单用法

    synchronized 锁定要操作的对象: emp: synchronized(要锁定的对象){ //要做的动作 }

  7. [LeetCode] 106. Construct Binary Tree from Postorder and Inorder Traversal_Medium tag: Tree Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  8. nodejs+websocket聊天工具

    该聊天工具,使用nodejs起服务,websocket前端页面,聊天工具,,可以有任意多的人数参与聊天,里面的用户ID为模拟ID. 先上图 文件夹结构, 1.安装ws模块,npm install ws ...

  9. log4j.properties配置详解与实例-全部测试通过[转]

    最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累.这里把网上收集到的整理了一下,并且全部都在机器上测试成功了.这么好的文档估计没有了吧? # ...

  10. Java - Selenium 环境配置

    1. 安装Java JDK - 文件自己下 2. 配置环境变量-重要! 我的电脑-属性-高级-环境变量 添加 CLASSPATH  值 .;%JAVA_HOME%\lib;%JAVA_HOME%\li ...