//10224045 c00h00g 1915 Accepted 1328K 79MS C++ 2493B 2012-05-22 11:35:10
#include<iostream>
#include<queue>
using namespace std;
int mat[305][305];
int d1[305][305];//head
int d2[305][305];//tail
struct Node{
int x,y;
};
int N,n;
int res;
bool found;
queue<Node> qhead,qtail;
Node nd[305];
int visited[305][305];
int dir[8][2]={
{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}
};
bool check(int x,int y){
if(x<0||y<0||x>=n||y>=n)
return false;
return true;
}
void bfs(queue<Node> &q,bool flag){
Node tmp=q.front();
q.pop();
//操作正向队列
if(flag){
for(int i=0;i<8;i++){
if(check(tmp.x+dir[i][0],tmp.y+dir[i][1])&&visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]!=1){
if(visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]==2){
found=true;
d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d1[tmp.x][tmp.y]+1;
res=d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]+d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]];
return;
}
visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=1;
d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d1[tmp.x][tmp.y]+1;
Node aa;
aa.x=tmp.x+dir[i][0];
aa.y=tmp.y+dir[i][1];
qhead.push(aa);
}
}
}else{
for(int i=0;i<8;i++){
if(check(tmp.x+dir[i][0],tmp.y+dir[i][1])&&visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]!=2){
if(visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]==1){
found=true;
d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d2[tmp.x][tmp.y]+1;
res=d1[tmp.x+dir[i][0]][tmp.y+dir[i][1]]+d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]];
return;
}
visited[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=2;
d2[tmp.x+dir[i][0]][tmp.y+dir[i][1]]=d2[tmp.x][tmp.y]+1;
Node aa;
aa.x=tmp.x+dir[i][0];
aa.y=tmp.y+dir[i][1];
qtail.push(aa);
}
}
}
}
int main(){
scanf("%d",&N);
Node start,end;
while(N--){
while(!qhead.empty())
qhead.pop();
while(!qtail.empty())
qtail.pop();
res=0;
found=false;
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
memset(visited,0,sizeof(visited));
scanf("%d",&n);
scanf("%d%d",&start.x,&start.y);
scanf("%d%d",&end.x,&end.y);
bool flag=false;
if(start.x==end.x&&start.y==end.y){
res=0;
flag=true;
}
if(!flag){
qhead.push(start);
qtail.push(end);
visited[start.x][start.y]=1;
visited[end.x][end.y]=2;
while(!qhead.empty()||!qtail.empty()){
if(!qhead.empty())
bfs(qhead,true);
if(found)
break;
if(!qtail.empty())
bfs(qtail,false);
if(found)
break;
}
}
printf("%d\n",res);
}
return 0;
}
POJ 1915 双向广搜
最新推荐文章于 2021-08-09 23:24:17 发布