http://acm.pku.edu.cn/JudgeOnline/problem?id=1915
题意:问骑士由A到B最少要走多少步。
#include <cstdio>
#include <queue>
#include <iostream>
using namespace std;
struct Point
{
int x;
int y;
int sum;
Point(int x = 0,int y = 0,int s = 0):x(x),y(y),sum(s)
{
//
}
};
bool flag[301][301];
int step[8][2] = {{1,2},{-1,2},{2,1},{-2,1},{1,-2},{-1,-2},{2,-1},{-2,-1}};
int number;
Point start,end;
bool Over(int a)
{
return (a >= number || a < 0);
}
int Bfs(Point start,Point end)
{
int i;
int x,y;
queue<Point> q;
memset(flag,false,sizeof(flag));
q.push(start);
flag[start.x][start.y] = true;
while(! q.empty())
{
x = q.front().x;
y = q.front().y;
if(x == end.x && y == end.y)
return q.front().sum;
for(i = 0;i < 8;i ++)
{
if(!Over(x+step[i][0]) && !Over(y+step[i][1]) && flag[x+step[i][0]][y+step[i][1]] == false)
{
q.push(Point(x+step[i][0],y+step[i][1],q.front().sum+1));
flag[x+step[i][0]][y+step[i][1]] = true;
}
}
q.pop();
}
return -1 ;
}
int main()
{
int test;
scanf("%d",&test);
while(test --)
{
scanf("%d",&number);
scanf("%d%d",&start.x,&start.y);
scanf("%d%d",&end.x,&end.y);
printf("%d/n",Bfs(start,end));
}
return 0 ;
}
/*
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
5
28
0
*/