#include #include #include #include using namespace std; #ifdef HOME_DEBUG static std::ifstream input ("input.txt"); static std::ofstream output("output.txt"); #else static std::istream& input = std::cin; static std::ostream& output = std::cout; #endif struct Map { int n=0; int v[200][200]; bool exist(int x,int y){ return x>=0 && x=0 && y::max() ) output << "."; else output << v[r][i]; output << endl; } } }; struct Pos { int x,y; }; void wrk(Map& m,int sx,int sy,int ex,int ey){ std::queue q; q.emplace(Pos{sx,sy}); for(int i=0;i<200;++i) for(int r=0;r<200;++r) m.v[i][r]=std::numeric_limits::max(); m.v[sx][sy]=0; const char* mvName[6] ={"UL","UR","R","LR","LL","L"}; int dx[6]={ -1, 1, 2, 1, -1, -2}; int dy[6]={ -2, -2, 0, 2, 2, 0}; while(q.size() && m.v[ex][ey]==std::numeric_limits::max()) { auto p=q.front(); q.pop(); int v=m.v[p.x][p.y]+1; for(int i=0;i<6;++i){ Pos n={p.x+dx[i],p.y+dy[i]}; if( m.exist(n.x,n.y) && m.v[n.x][n.y]>v ){ m.v[n.x][n.y]=v; q.push(n); } } } if( m.v[ex][ey]==std::numeric_limits::max() ) { output << "Impossible" << endl; return; } std::vector mv; Pos p=Pos{ex,ey}; for(bool w=true;w;){ w=false; int v=m.v[p.x][p.y]-1; for(int i=5;i>=0;--i){ Pos n={p.x-dx[i],p.y-dy[i]}; if( m.exist(n.x,n.y) && m.v[n.x][n.y]==v ){ w=true; p=n; mv.push_back(mvName[i]); break; } } } output << m.v[ex][ey] << endl; for(int i=0;i> m.n >> sx >> sy >> ex >> ey; wrk(m,sy,sx,ey,ex); //m.dbg(); return 0; }