题目描述
骑士的行走方式类似于象棋中的马,现在给你一个任务,计算骑士从一点到另一点所需的最少步数。
输入
第一行给出骑士的数量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;
}
(其实还可以用双向搜索,时间会短一点,但本蒟蒻并不会。。。。。。)