骑士

题目描述

骑士的行走方式类似于象棋中的马,现在给你一个任务,计算骑士从一点到另一点所需的最少步数。

输入

第一行给出骑士的数量n。对于每一个骑士都有3行,第一行一个整数L,表示棋盘的大小(4<=L<=300),整个棋盘大小为LxL(坐标范围为0…L);第二行和第三行分别包含一对整数(xy),表示骑士的起始点和终点。假设,对于每一个骑士起始点和终点均合理。

输出

对每一个骑士输出一行,一个整数表示需要移动的最少步数。如果起始点和终点相同,则输出0。

样例输入

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

样例输出

5
28
0

思路

一道很典型的广搜题,复制一下模板基本上就A了(深搜会时间超限)。

代码

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int x,x1,y,y1;
int book[400][400];
int xx[8]={-1,1,2,2,1,-1,-2,-2};
int yy[8]={-2,-2,-1,1,2,2,1,-1};
struct node {
    int tx,tx1,ty,ty1;//起点和终点 
    int ans;//步数 
};
int main(){
    int n,l;
    cin>>n;
    for(int i=0;i<n;i++){
        memset(book,0,sizeof(book));
        cin>>l;
        cin>>x>>y>>x1>>y1;
        node a;
        a.ans=0;
        a.tx=x;
        a.ty=y;
        a.tx1=x1;
        a.ty1=y1;
        queue<node> ab;//结构体队列 
        ab.push(a);
        //开始广搜 
        while(!ab.empty()){
            node zyf=ab.front();
            ab.pop();
            if(zyf.tx==zyf.tx1&&zyf.ty==zyf.ty1){//满足条件 
                cout<<zyf.ans<<endl;
                break;
            }
            if(book[zyf.tx][zyf.ty]==0){
                book[zyf.tx][zyf.ty]=1;
                for(int i=0;i<8;i++){//枚举8个方向 
				int txx=zyf.tx+xx[i],tyy=zyf.ty+yy[i];
                    if(txx>=0&&txx<=l&&tyy>=0&&tyy<=l){
                        node ttt=zyf;
                        ttt.tx=txx;ttt.ty=tyy;
                        ttt.ans=zyf.ans+1;
                        ab.push(ttt);
                    }
                }
            }
        }
    }
    return 0;
}

(其实还可以用双向搜索,时间会短一点,但本蒟蒻并不会。。。。。。)

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/zhuyifan_jizhi/article/details/81112014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞