#include <vector>
using namespace std;
enum class TILE : int
{
open, wall, blocked, goal,
left, up, right, down,
path_left, path_up, path_right, path_down,
};
TILE* map = nullptr;
#define int_to_tile( integer ) static_cast< TILE >( integer )
#define tile_to_int( tile ) static_cast< int >( tile )
#define tile_at( p ) map[ p.x + p.y * map_size.x ]
struct POINT
{
int x, y;
bool operator!=( const POINT& rhs ) const
{
return x != rhs.x || y != rhs.y;
}
const POINT operator+( const POINT& rhs ) const
{
return { x + rhs.x, y + rhs.y };
}
POINT& move( const TILE direction )
{
constexpr POINT delta[ 4 ] =
{
{ -1, 0 },
{ 0, -1 },
{ 1, 0 },
{ 0, 1 },
};
return *this = ( *this + delta[ tile_to_int( direction ) & 3 ] );
}
};
POINT map_size;
POINT start, goal;
inline bool empty( const POINT point, const TILE direction )
{
POINT p = point;
p.move( direction );
return tile_at( p ) == TILE::open;
}
bool trace_map()
{
vector< POINT > branch;
// path finding
POINT position = start;
while( position != goal )
{
int dir = 0;
for( int d = 0; d < 4; ++d )
if( empty( position, int_to_tile( d ) ) )
dir = dir * 4 + d;
if( dir == 0 ) // blocked
{
if( branch.empty() )
return false;
tile_at( position ) = TILE::blocked;
position = branch.back();
branch.pop_back();
continue;
}
else if( dir >= 4 ) // many ways
{
branch.push_back( position );
}
// else : single way
dir &= 3;
tile_at( position ) = int_to_tile( dir + 4 );
position.move( int_to_tile( dir ) );
}
// path drawing
position = start;
while( position != goal )
position.move( int_to_tile( *(int*)&tile_at( position ) += 4 ) );
tile_at( position ) = TILE::goal;
return true;
}
#include <iostream>
void load_map()
{
if( map != nullptr ) delete[] map;
map = new TILE[ map_size.x * map_size.y ];
while( getchar() != 10 );
for( int y = 0; y < map_size.y; ++y )
{
auto* scanline = map + y * map_size.x;
for( int x = 0; x < map_size.x; ++x )
scanline[ x ] = int_to_tile( getchar() - '0' );
while( getchar() != 10 );
}
}
void print_map()
{
const char shapes[] =
{ ' ', '#', ' ', '+', ' ', ' ', ' ', ' ', '<', '^', '>', 'v' };
for( int y = 0; y < map_size.y; ++y )
{
auto* scanline = map + y * map_size.y;
for( int x = 0; x < map_size.x; ++x )
putchar( shapes[ tile_to_int( scanline[ x ] ) ] );
putchar( 10 );
}
}
int main()
{
cin >> map_size.x >> map_size.y;
cin >> start.x >> start.y;
cin >> goal.x >> goal.y;
load_map();
trace_map();
print_map();
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgplbnVtIGNsYXNzIFRJTEUgOiBpbnQKewogICAgb3Blbiwgd2FsbCwgYmxvY2tlZCwgZ29hbCwKICAgIGxlZnQsIHVwLCByaWdodCwgZG93biwKICAgIHBhdGhfbGVmdCwgcGF0aF91cCwgcGF0aF9yaWdodCwgcGF0aF9kb3duLAp9OwoKVElMRSogbWFwID0gbnVsbHB0cjsKCiNkZWZpbmUgaW50X3RvX3RpbGUoIGludGVnZXIgKSAgc3RhdGljX2Nhc3Q8IFRJTEUgPiggaW50ZWdlciApCiNkZWZpbmUgdGlsZV90b19pbnQoIHRpbGUgKSAgICAgc3RhdGljX2Nhc3Q8IGludCA+KCB0aWxlICkKI2RlZmluZSB0aWxlX2F0KCBwICkgICAgICAgICAgICBtYXBbIHAueCArIHAueSAqIG1hcF9zaXplLnggXQoKc3RydWN0IFBPSU5UCnsKICAgIGludCB4LCB5OwoKICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUE9JTlQmIHJocyApIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuICB4ICE9IHJocy54IHx8IHkgIT0gcmhzLnk7CiAgICB9CgogICAgY29uc3QgUE9JTlQgb3BlcmF0b3IrKCBjb25zdCBQT0lOVCYgcmhzICkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4geyB4ICsgcmhzLngsIHkgKyByaHMueSB9OwogICAgfQoKICAgIFBPSU5UJiBtb3ZlKCBjb25zdCBUSUxFIGRpcmVjdGlvbiApCiAgICB7CiAgICAgICAgY29uc3RleHByIFBPSU5UIGRlbHRhWyA0IF0gPQogICAgICAgIHsKICAgICAgICAgICAgeyAtMSwgIDAgfSwKICAgICAgICAgICAgeyAgMCwgLTEgfSwKICAgICAgICAgICAgeyAgMSwgIDAgfSwKICAgICAgICAgICAgeyAgMCwgIDEgfSwKICAgICAgICB9OwogICAgICAgIHJldHVybiAqdGhpcyA9ICggKnRoaXMgKyBkZWx0YVsgdGlsZV90b19pbnQoIGRpcmVjdGlvbiApICYgMyBdICk7CiAgICB9Cn07CgpQT0lOVCBtYXBfc2l6ZTsKUE9JTlQgc3RhcnQsIGdvYWw7CgppbmxpbmUgYm9vbCBlbXB0eSggY29uc3QgUE9JTlQgcG9pbnQsIGNvbnN0IFRJTEUgZGlyZWN0aW9uICkKewogICAgUE9JTlQgcCA9IHBvaW50OwogICAgcC5tb3ZlKCBkaXJlY3Rpb24gKTsKICAgIHJldHVybiAgdGlsZV9hdCggcCApID09IFRJTEU6Om9wZW47Cn0KCmJvb2wgdHJhY2VfbWFwKCkKewogICAgdmVjdG9yPCBQT0lOVCA+IGJyYW5jaDsKCiAgICAvLyBwYXRoIGZpbmRpbmcKICAgIFBPSU5UIHBvc2l0aW9uID0gc3RhcnQ7CiAgICB3aGlsZSggcG9zaXRpb24gIT0gZ29hbCApCiAgICB7CiAgICAgICAgaW50IGRpciA9IDA7CiAgICAgICAgZm9yKCBpbnQgZCA9IDA7IGQgPCA0OyArK2QgKQogICAgICAgICAgICBpZiggZW1wdHkoIHBvc2l0aW9uLCBpbnRfdG9fdGlsZSggZCApICkgKQogICAgICAgICAgICAgICAgZGlyID0gZGlyICogNCArIGQ7CgogICAgICAgIGlmKCBkaXIgPT0gMCApIC8vIGJsb2NrZWQKICAgICAgICB7CiAgICAgICAgICAgIGlmKCBicmFuY2guZW1wdHkoKSApCiAgICAgICAgICAgICAgICByZXR1cm4gIGZhbHNlOwogICAgICAgICAgICB0aWxlX2F0KCBwb3NpdGlvbiApID0gVElMRTo6YmxvY2tlZDsKICAgICAgICAgICAgcG9zaXRpb24gPSBicmFuY2guYmFjaygpOwogICAgICAgICAgICBicmFuY2gucG9wX2JhY2soKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIGRpciA+PSA0ICkgLy8gbWFueSB3YXlzCiAgICAgICAgewogICAgICAgICAgICBicmFuY2gucHVzaF9iYWNrKCBwb3NpdGlvbiApOwogICAgICAgIH0KICAgICAgICAvLyBlbHNlIDogc2luZ2xlIHdheQogICAgICAgIGRpciAmPSAzOwogICAgICAgIHRpbGVfYXQoIHBvc2l0aW9uICkgPSBpbnRfdG9fdGlsZSggZGlyICsgNCApOwogICAgICAgIHBvc2l0aW9uLm1vdmUoIGludF90b190aWxlKCBkaXIgKSApOwogICAgfQoKICAgIC8vIHBhdGggZHJhd2luZwogICAgcG9zaXRpb24gPSBzdGFydDsKICAgIHdoaWxlKCBwb3NpdGlvbiAhPSBnb2FsICkKICAgICAgICBwb3NpdGlvbi5tb3ZlKCBpbnRfdG9fdGlsZSggKihpbnQqKSZ0aWxlX2F0KCBwb3NpdGlvbiApICs9IDQgKSApOwoKICAgIHRpbGVfYXQoIHBvc2l0aW9uICkgPSBUSUxFOjpnb2FsOwogICAgcmV0dXJuICB0cnVlOwp9CgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp2b2lkIGxvYWRfbWFwKCkKewogICAgaWYoIG1hcCAhPSBudWxscHRyICkgZGVsZXRlW10gbWFwOwogICAgbWFwID0gbmV3IFRJTEVbIG1hcF9zaXplLnggKiBtYXBfc2l6ZS55IF07CiAgICB3aGlsZSggZ2V0Y2hhcigpICE9IDEwICk7CiAgICBmb3IoIGludCB5ID0gMDsgeSA8IG1hcF9zaXplLnk7ICsreSApCiAgICB7CiAgICAgICAgYXV0byogc2NhbmxpbmUgPSBtYXAgKyB5ICogbWFwX3NpemUueDsKICAgICAgICBmb3IoIGludCB4ID0gMDsgeCA8IG1hcF9zaXplLng7ICsreCApCiAgICAgICAgICAgIHNjYW5saW5lWyB4IF0gPSBpbnRfdG9fdGlsZSggZ2V0Y2hhcigpIC0gJzAnICk7CiAgICAgICAgd2hpbGUoIGdldGNoYXIoKSAhPSAxMCApOwogICAgfQp9Cgp2b2lkIHByaW50X21hcCgpCnsKICAgIGNvbnN0IGNoYXIgc2hhcGVzW10gPQogICAgeyAnICcsICcjJywgJyAnLCAnKycsICcgJywgJyAnLCAnICcsICcgJywgJzwnLCAnXicsICc+JywgJ3YnIH07CgogICAgZm9yKCBpbnQgeSA9IDA7IHkgPCBtYXBfc2l6ZS55OyArK3kgKQogICAgewogICAgICAgIGF1dG8qIHNjYW5saW5lID0gbWFwICsgeSAqIG1hcF9zaXplLnk7CiAgICAgICAgZm9yKCBpbnQgeCA9IDA7IHggPCBtYXBfc2l6ZS54OyArK3ggKQogICAgICAgICAgICBwdXRjaGFyKCBzaGFwZXNbIHRpbGVfdG9faW50KCBzY2FubGluZVsgeCBdICkgXSApOwogICAgICAgIHB1dGNoYXIoIDEwICk7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgY2luID4+IG1hcF9zaXplLnggPj4gbWFwX3NpemUueTsKICAgIGNpbiA+PiBzdGFydC54ID4+IHN0YXJ0Lnk7CiAgICBjaW4gPj4gZ29hbC54ID4+IGdvYWwueTsKCiAgICBsb2FkX21hcCgpOwogICAgdHJhY2VfbWFwKCk7CiAgICBwcmludF9tYXAoKTsKCiAgICByZXR1cm4gMDsKfQ==