题目描述(翻译)

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. django上下文处理器

    上下文处理器(context processors)上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每 ...

  2. POJ2274 Long Long Message 字符串

    正解:SA/哈希+二分 解题报告: 传送门! 啊先放下翻译,,,?大意就有两个字符串,求这两个字符串的最长公共子串 先港SA的做法趴 就把两个子串拼接起来,然后题目就变成了求后缀的最长公共前缀了 所以 ...

  3. 洛谷P3158 放棋子 [CQOI2011] dp+数论

    正解:dp+数论 解题报告: 传送门! 考虑对每种颜色的棋子单独考虑鸭,那显然有,当某一行或某一列已经被占据的时候,那一行/一列就不能再放别的颜色的棋子了,相当于直接把那一行/一列直接消了 显然就能考 ...

  4. pyqt5-对文本样式进行操作

    self.label_2 = QtWidgets.QLabel(self.centralWidget) self.label_2.setGeometry(QtCore.QRect(330, 220, ...

  5. 如何在win+r 或者是win10的应用搜索输入subl就能打开sublime

    这虽然不是什么技术贴,我实在不想开启sublime还要动鼠标,或者输入subl长长的全称,这里有两种做法: 第一种 在环境变量添加sublime安装目录的变量,一般sublime的安装目录会有subl ...

  6. SpringBoot-整合多数据源

    整合多数据源 这里有两种,分包数据源和注解数据源,这里讲分包数据源 配置文件中新增两个数据源 spring.datasource.test1.driverClassName = com.mysql.j ...

  7. jmeter测试文件上传接口报错:connection reset by peer: socket write error

    最近在对文件上传接口性能测试时,设置150线程数并发时,总会出现以下错误:connection reset by peer: socket write error 在网上搜索了一下,得到的原因有这些: ...

  8. kafka2 简单介绍

    kafka是JMS的一种实现 JMS(java message service):middle ware,中间件技术.Queue:队列模式,P2P,点对点.publish-subscribe:主题模式 ...

  9. PE破解win2008登录密码

    1.使用PE系统启动计算机. 2.使用cmd命令行程序. 3.备份一下magnify.exe(windows 放大镜程序). copy C:\WINDOWS\system32\magnify.exe ...

  10. 学习Shell(二)变量

    如何给shell脚本传入参数 1.执行“vi test.sh”创建一个新的shell脚本. vi test.sh 2.脚本test.sh的内容如下: #!/bin/sh name=$ echo &qu ...