#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> using namespace std; int stx,sty,edx,edy; int gr[405][405]; int dirx[8]={-2,-2,2,2,1,1,-1,-1}; int diry[8]={1,-1,1,-1,2,-2,2,-2}; int dx[4]={2,2,-2,-2}; int dy[4]={-2,2,2,-2}; int n; int bfs() { queue<int> q; int x,y; //int visit[405][405]; //memset(visit,0,sizeof(visit)); int moveTyp=0,move; int step=0,stepCount; q.push(stx);q.push(sty);q.push(moveTyp);q.push(step); if(gr[stx][sty]==1) return -1; else if(gr[edx][edy]==1) return -1; while(!q.empty()) { x = q.front();q.pop(); y = q.front();q.pop(); moveTyp = q.front();q.pop(); stepCount = q.front();q.pop(); gr[x][y]=1; if(x==edx && y==edy) { return stepCount; } if(moveTyp==0) { //move=1;//regular move for(int i=0;i<8;i++) { if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0) { q.push(x+dirx[i]); q.push(y+diry[i]); q.push(1); q.push(stepCount+1); } } //move=2//bishop for(int i=0;i<4;i++) { if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0) { q.push(x+dx[i]); q.push(y+dy[i]); q.push(2); q.push(stepCount+1); } } //move=3//teleportation if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0) { q.push(2*n-x+1); q.push(y); q.push(3); q.push(stepCount+1); } if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0) { q.push(x); q.push(2*n-y+1); q.push(3); q.push(stepCount+1); } } else if(moveTyp==1) { //move=2//bishop for(int i=0;i<4;i++) { if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0) { q.push(x+dx[i]); q.push(y+dy[i]); q.push(2); q.push(stepCount+1); } } //move=3//teleportation if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0) { q.push(2*n-x+1); q.push(y); q.push(3); q.push(stepCount+1); } if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0) { q.push(x); q.push(2*n-y+1); q.push(3); q.push(stepCount+1); } } else if(moveTyp==2) { //move=3//teleportation if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0) { q.push(2*n-x+1); q.push(y); q.push(3); q.push(stepCount+1); } if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0) { q.push(x); q.push(2*n-y+1); q.push(3); q.push(stepCount+1); } //move=1;//regular move for(int i=0;i<8;i++) { if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0) { q.push(x+dirx[i]); q.push(y+diry[i]); q.push(1); q.push(stepCount+1); } } } else if(moveTyp==3) { //move=1;//regular move for(int i=0;i<8;i++) { if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0) { q.push(x+dirx[i]); q.push(y+diry[i]); q.push(1); q.push(stepCount+1); } } //move=2//bishop for(int i=0;i<4;i++) { if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0) { q.push(x+dx[i]); q.push(y+dy[i]); q.push(2); q.push(stepCount+1); } } } } return -1; } int main() { int a,b; while(scanf("%d",&n),n) { scanf("%d%d",&stx,&sty); scanf("%d%d",&edx,&edy); memset(gr,0,sizeof(gr)); while(scanf("%d%d",&a,&b),a,b) { gr[a][b]=1; } int ret = bfs(); if(ret==-1) { printf("Solution doesn't exist\n"); } else printf("Result : %d\n",ret); } return 0; }