説明[タイトル]
入力のn
Aの代表N- × N-
ボード、入力開始位置と終了位置座標は、あなたを介して行くことができますどのように多くの手順座標座標最初から最後まで、ボード一遍の言葉ステップの8つの方向の騎士を尋ねました。
[Enter]を
まず、入力したn個の
これは、試験サンプルの数を示します。
各試験サンプルは3行があります。
最初の行は、基板の大きさL(4≦ L ≤300)
;
2行目と3行目は、馬開始位置と目標位置表し(0 .. Lを -1)
。
[出力]
馬は、ステップの最小数は、開始位置と目標位置が同じ出力0である移動します
。
[サンプル入力】
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
[サンプル出力]
5
28
0
// Created on 2020/2/9
/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>
#define MAXX 40*40+5
using namespace std;
//int i,j,k;
const int maxn=INT_MAX;
const int idata=100000+5;
//int aim[idata];
bool judge[305][305];
bool flag;
int soux,souy,
exitx,exity;
//int maps[idata][idata];
const int change[8][2]={{2,1},{2,-1},{1,2},{1,-2},
{-2,1},{-2,-1},{-1,2},{-1,-2}};
int n,m;
int ans[idata];
int nx,ny;
int x[idata],y[idata];
int main()
{
int head,tail;
int i,j;
int t;
cin>>t;
while(t--)
{
flag=0;
memset(judge,0,sizeof(judge));
cin>>n;
cin>>soux>>souy;
cin>>exitx>>exity;
if(soux==exitx&&souy==exity)
{
cout<<0<<endl;
continue;
}
head=0,tail=1;
x[1]=soux,y[1]=souy;
judge[soux][souy]=1;
ans[1]=0;
do
{
head++;
for(i=0;i<8;i++)
{
nx=x[head]+change[i][0];
ny=y[head]+change[i][1];
if(nx>=0&&ny>=0&&nx<n&&ny<n
&&!judge[nx][ny])
{
judge[nx][ny]=1;
tail++;
x[tail]=nx;
y[tail]=ny;
ans[tail]=ans[head]+1;
}
if(nx==exitx&&ny==exity)
{
flag=1;
cout<<ans[tail]<<endl;
break;
}
}
if(flag) break;
}while(head<tail);
}
return 0;
}