//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; }