Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13341 | Accepted: 5889 |
Description
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
Source
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n;
int vis[2][300][300];
int xx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int yy[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
struct Node
{
int x,y;
};
Node pre,end;
queue<Node> q[2];
int bfs()
{
while(!q[0].empty()) q[0].pop();
while(!q[1].empty()) q[1].pop();
q[0].push(pre);
q[1].push(end);
while(!q[0].empty()||!q[1].empty())
{
if(!q[0].empty())
{
Node temp=q[0].front();q[0].pop();
int x=temp.x,y=temp.y;
for(int i=0;i<8;i++)
{
int x1=x+xx[i],y1=y+yy[i];
if(x1<0||x1>=n||y1<0||y1>=n) continue;
if(vis[0][x1][y1]!=-1) continue;
Node later;
later.x=x1,later.y=y1;
vis[0][x1][y1]=vis[0][x][y]+1;
if(vis[1][x1][y1]>=0)
{
return vis[0][x1][y1]+vis[1][x1][y1];
}
q[0].push(later);
}
}
if(!q[1].empty())
{
Node temp=q[1].front();q[1].pop();
int x=temp.x,y=temp.y;
for(int i=0;i<8;i++)
{
int x1=x+xx[i],y1=y+yy[i];
if(x1<0||x1>=n||y1<0||y1>=n) continue;
if(vis[1][x1][y1]!=-1) continue;
Node later;
later.x=x1,later.y=y1;
vis[1][x1][y1]=vis[1][x][y]+1;
if(vis[0][x1][y1]>=0)
{
return vis[0][x1][y1]+vis[1][x1][y1];
}
q[1].push(later);
}
}
}
}
int main()
{
int ci;scanf("%d",&ci);
while(ci--)
{
memset(vis,-1,sizeof(vis));
scanf("%d",&n);
scanf("%d%d",&pre.x,&pre.y);
vis[0][pre.x][pre.y]=0;
scanf("%d%d",&end.x,&end.y);
vis[1][end.x][end.y]=0;
if(pre.x==end.x&&pre.y==end.y)
{
printf("0/n");
continue;
}
int cnt=bfs();
printf("%d/n",cnt);
}
return 0;
}