1257:Knight Moves
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 1453 通过数: 681
【题目描述】
输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。
【输入】
首先输入一个nn,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300)L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0…L−1)(0…L−1)。
【输出】
马移动的最小步数,起始位置和目标位置相同时输出00。
【输入样例】
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
【输出样例】
5
28
0
#include<iostream>
#include<cstring>
using namespace std;
bool v[301][301];
int qi[100001],qj[100001],qans[100001];
int dis[8][2]={{2,-1},{2,1},{1,-2},{1,2},{-1,2},{-1,-2},{-2,1},{-2,-1}};
int main()
{
int n,si,sj,ei,ej,all;
cin>>all;
for(int i=1;i<=all;i++)
{
memset(v,false,sizeof(v));
cin>>n;
cin>>si>>sj>>ei>>ej;
int head=0,tail=1;
qi[0]=si;
qj[0]=sj;
v[si][sj]=true;
while(head!=tail)
{
int x=qi[head];
int y=qj[head];
int ans=qans[head];
if(x==ei&&y==ej)
{
cout<<ans<<endl;
break;
}
head++;
for(int i=0;i<8;i++)
{
int nx=x+dis[i][0];
int ny=y+dis[i][1];
if(nx<=n&&ny<=n&&nx>=0&&ny>=0&&!v[nx][ny])
{
v[nx][ny]=true;
qi[tail]=nx;
qj[tail]=ny;
qans[tail]=ans+1;
tail++;
}
}
}
}
return 0;
}