| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
第一道双搜!#include<cstdio>
#include<iostream>
#include<queue>;
using namespace std;
#define Maxn 309
struct node
{
int x,y;
};
int n;
int fstep[Maxn][Maxn],bstep[Maxn][Maxn];
int dir[8][2] = {-1,-2,-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2};
bool isok(node a)
{
if (a.x < 0 || a.x >= n || a.y < 0 || a.y >= n)
return false;
return true;
}
int BBFS(node a,node b)
{
if (a.x == b.x && a.y == b.y)
{
return 0;
}
int i,j;
queue<node>q1,q2;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
fstep[i][j] = bstep[i][j] = -1;
}
fstep[a.x][a.y] = 0;
bstep[b.x][b.y] = 0;
q1.push(a);
q2.push(b);
while (!q1.empty() && !q2.empty())
{
node tt,t1,t2;
if (!q1.empty())
{
t1 = q1.front();
q1.pop();
for (i = 0; i < 8; ++i)
{
tt.x = t1.x + dir[i][0];
tt.y = t1.y + dir[i][1];
if (isok(tt))
{
if (fstep[tt.x][tt.y] == -1)
{
fstep[tt.x][tt.y] = fstep[t1.x][t1.y] + 1;
q1.push(tt);
}
if (bstep[tt.x][tt.y] != -1)
return fstep[tt.x][tt.y] + bstep[tt.x][tt.y];
}
}
}
if (!q2.empty())
{
t2 = q2.front();
q2.pop();
for (i = 0; i < 8; ++i)
{
tt.x = t2.x + dir[i][0];
tt.y = t2.y + dir[i][1];
if (isok(tt))
{
if (bstep[tt.x][tt.y] == -1)
{
bstep[tt.x][tt.y] = bstep[t2.x][t2.y] + 1;
q2.push(tt);
}
if (fstep[tt.x][tt.y] != -1)
return bstep[tt.x][tt.y] + fstep[tt.x][tt.y];
}
}
}
}
}
int main()
{
int t,ans;
struct node a,b;
while (~scanf("%d",&t))
{
while (t--)
{
scanf("%d",&n);
scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
ans = BBFS(a,b);
printf("%d\n",ans);
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator