#include using namespace std; int n,moves[6][2]={ {-2,-1} , {-2,1} , {0,2} , {2,1} , {2,-1} , {0,-2} }; vector v; bool visited[202][202]={false}; int dist[202][202]; void printAllPathsUtil(int curr_i,int curr_j,int reach_i,int reach_j,int path[], int &path_index) { // Mark the current node and store it in path[] visited[curr_i][curr_j]=true; /*if((curr_i==reach_i)&&(curr_j==reach_j)&&(count==-1)) { return true; }*/ path_index++; // If current vertex is same as destination, then print // current path[] if ((curr_i==reach_i)&&(curr_j==reach_j)&&(path_index==dist[reach_i][reach_j]+1)) { for(int i=1;i=n||diry<0||diry>=n) continue; else{ if(!visited[dirx][diry]) { path[path_index]=i; printAllPathsUtil(dirx,diry,reach_i,reach_j, path, path_index); } } } } // Removes current vertex from path[] and mark it as unvisited path_index--; visited[curr_i][curr_j] = false; } void bfs(int curr_i,int curr_j,int reach_i,int reach_j) { dist[curr_i][curr_j]=0; queue < pair > q; q.push(make_pair(curr_i,curr_j)); while(!q.empty()) { pair parent = q.front(); int parent_i=parent.first,parent_j=parent.second; q.pop(); for(int i=0;i<6;i++) { int dirx=parent_i+moves[i][0]; int diry=parent_j+moves[i][1]; if(dirx<0||dirx>=n||diry<0||diry>=n) continue; else{ if(!dist[dirx][diry]) { q.push(make_pair(dirx,diry)); dist[dirx][diry]=dist[parent_i][parent_j]+1; if((dirx==reach_i)&&(diry==reach_j)) break; } } } } } int main() { int starti,startj,desti,destj; cin>>n>>starti>>startj>>desti>>destj; for(int i=0;i<202;i++) { for(int j=0;j<202;j++) visited[i][j]=false; } int path[10005],path_index=0; bfs(starti,startj,desti,destj); if(dist[desti][destj]) { cout<