在棋盘上从某个点出发以最短的距离到达另一个点。直接用BFS。代码如下:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std ;
struct Node{
int x ;
int y ;
int s ;
};
int n ;
int l ;
int map[305][305] ;
int dir[][2] ={{-1,2} ,{1,2} ,{2,1} , {2,-1} ,
{1,-2} ,{-1,-2} ,{-2 ,-1},{-2 , 1}} ;
void bfs(int sx , int sy , int ex , int ey){
queue<Node> Q ;
Node a ;
Node b ;
a.x = sx ;
a.y = sy ;
a.s = 0 ;
map[sx][sy] = 1 ;
Q.push(a) ;
while(!Q.empty()){
b = Q.front() ;
if(b.x == ex && b.y == ey){
printf("%d\n" , b.s) ;
}
Q.pop() ;
for(int i = 0 ; i < 8 ; i ++){
if(b.x + dir[i][0] >= 0 && b.x + dir[i][0] < l && b.y + dir[i][1] >= 0 && b.y + dir[i][1] < l){
Node c ;
c.x = b.x + dir[i][0] ;
c.y = b.y + dir[i][1] ;
c.s = b.s + 1 ;
if(!map[c.x][c.y]){
Q.push(c) ;
map[c.x][c.y] = 1 ;
}
}
}
}
}
void work(){
scanf("%d" , &l) ;
int sx ;
int sy ;
int ex ;
int ey ;
scanf("%d %d" , &sx , &sy) ;
scanf("%d %d" , &ex , &ey) ;
memset(map , 0 , sizeof(map)) ;
bfs(sx , sy , ex , ey) ;
}
int main(){
scanf("%d" , &n) ;
while(n--){
work() ;
}
return 0 ;
}