#include <bits/stdc++.h>
using namespace std;
char grid[ 25 ] [ 25 ] ;
int n, posy, posx;
bool sol;
bool canMove( int x, int y)
{
return ( grid[ x + 1 ] [ y] == '.' && x + 1 < n + 1 )
|| ( grid[ x - 1 ] [ y] == '.' && x - 1 > 0 )
|| ( grid[ x] [ y + 1 ] == '.' && y + 1 < n + 1 )
|| ( grid[ x] [ y - 1 ] == '.' && y - 1 > 0 ) ;
}
vector< string> ans;
bool valid( int x, int y)
{
return x > 0 && x < n + 1 && y > 0 && y < n + 1 && grid[ x] [ y] == '.' ;
}
bool solve( int x, int y)
{
//basecase
if ( sol) return 1 ;
if ( ! canMove( x, y) )
{
for ( int i = 1 ; i <= n; ++ i)
for ( int j = 1 ; j <= n; ++ j)
if ( grid[ i] [ j] == '.' )
return 0 ;
sol = 1 ;
return 1 ;
}
if ( valid( x + 1 , y) )
{
int end = n;
//Do
for ( int i = x + 1 ; i <= n; ++ i)
{
if ( valid( i, y) )
{
grid[ i] [ y] = 'x' ;
end = i;
}
else
{
break ;
}
}
ans.push_back ( "Down" ) ;
//Recurse
if ( solve( end, y) )
return 1 ;
//Undo
for ( int i = end; i > x; -- i)
grid[ i] [ y] = '.' ;
ans.pop_back ( ) ;
}
if ( valid( x - 1 , y) )
{
int end = 1 ;
//Do
for ( int i = x - 1 ; i >= 1 ; -- i)
{
if ( valid( i, y) )
{
grid[ i] [ y] = 'x' ;
end = i;
}
else
{
break ;
}
}
ans.push_back ( "UP" ) ;
//Recurse
if ( solve( end, y) )
return 1 ;
//Undo
for ( int i = end; i < x; ++ i)
grid[ i] [ y] = '.' ;
ans.pop_back ( ) ;
}
if ( valid( x, y + 1 ) )
{
int end = n;
//Do
for ( int i = y + 1 ; i <= n; ++ i)
{
if ( valid( x, i) )
{
grid[ x] [ i] = 'x' ;
end = i;
}
else
{
break ;
}
}
ans.push_back ( "Right" ) ;
//Recurse
if ( solve( x, end) )
return 1 ;
//Undo
for ( int i = end; i > y; -- i)
grid[ x] [ i] = '.' ;
ans.pop_back ( ) ;
}
if ( valid( x, y - 1 ) )
{
int end = 1 ;
//Do
for ( int i = y - 1 ; i >= 1 ; -- i)
{
if ( valid( x, i) )
{
grid[ x] [ i] = 'x' ;
end = i;
}
else
{
break ;
}
}
ans.push_back ( "Left" ) ;
//Recurse
if ( solve( x, end) )
return 1 ;
//Undo
for ( int i = end; i < y; ++ i)
grid[ x] [ i] = '.' ;
ans.pop_back ( ) ;
}
return 0 ;
}
int main( )
{
cout << "note: this code works on an N*N matrix and is 1-based\n " ;
cout << "enter the grid size \n " ;
cin >> n;
cout << "enter the coordinate of the y-axis \n " ;
cin >> posy;
cout << "enter the coordinate of the x-axis \n " ;
cin >> posx;
//input
for ( int i = 1 ; i <= n ; ++ i)
for ( int j = 1 ; j <= n; ++ j)
cin >> grid[ i] [ j] ;
//processing
grid[ posy] [ posx] = 'x' ;
solve( posy, posx) ;
//output
if ( ans.size ( ) )
for ( int i = 0 ; i < ans.size ( ) ; ++ i)
cout << ans[ i] << " " ;
else
puts ( "Cant" ) ;
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2hhciBncmlkWzI1XVsyNV07CgppbnQgbiwgcG9zeSwgcG9zeDsKCmJvb2wgc29sOwoKYm9vbCBjYW5Nb3ZlKGludCB4LCBpbnQgeSkKewoJcmV0dXJuIChncmlkW3ggKyAxXVt5XSA9PSAnLicgJiYgeCArIDEgPCBuICsgMSkKCQl8fCAoZ3JpZFt4IC0gMV1beV0gPT0gJy4nICYmIHggLSAxID4gMCkKCQl8fCAoZ3JpZFt4XVt5ICsgMV0gPT0gJy4nICYmIHkgKyAxIDwgbiArIDEpCgkJfHwgKGdyaWRbeF1beSAtIDFdID09ICcuJyAmJiB5IC0gMSA+IDApOwp9Cgp2ZWN0b3I8c3RyaW5nPiBhbnM7CmJvb2wgdmFsaWQoaW50IHgsIGludCB5KQp7CglyZXR1cm4geCA+IDAgJiYgeCA8IG4gKyAxICYmIHkgPiAwICYmIHkgPCBuICsgMSAmJiBncmlkW3hdW3ldID09ICcuJzsKfQpib29sIHNvbHZlKGludCB4LCBpbnQgeSkKewoJLy9iYXNlY2FzZQoJaWYoc29sKQlyZXR1cm4gMTsKCWlmKCFjYW5Nb3ZlKHgsIHkpKQoJewoJCWZvcihpbnQgaSA9IDEgOyBpIDw9IG47ICsraSkKCQkJZm9yKGludCBqID0gMTsgaiA8PSBuOyArK2opCgkJCQlpZihncmlkW2ldW2pdID09ICcuJykKCQkJCQlyZXR1cm4gMDsKCQlzb2wgPSAxOwkJCQoJCXJldHVybiAxOwoJfQoJaWYodmFsaWQoeCArIDEsIHkpKQoJewoJCWludCBlbmQgPSBuOwoJCS8vRG8KCQlmb3IoaW50IGkgPSB4ICsgMTsgaSA8PSBuOyArK2kpCgkJewoJCQlpZih2YWxpZChpLCB5KSkKCQkJewoJCQkJZ3JpZFtpXVt5XSA9ICd4JzsKCQkJCWVuZCA9IGk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlhbnMucHVzaF9iYWNrKCJEb3duIik7CgkJCgkJLy9SZWN1cnNlCgkJaWYoc29sdmUoZW5kLCB5KSkKCQkJcmV0dXJuIDE7CgkJCgkJLy9VbmRvCgkJZm9yKGludCBpID0gZW5kOyBpID4geDsgLS1pKQoJCQlncmlkW2ldW3ldID0gJy4nOwoJCWFucy5wb3BfYmFjaygpOwoJfQoJaWYodmFsaWQoeCAtIDEsIHkpKQoJewoJCWludCBlbmQgPSAxOwoJCS8vRG8KCQlmb3IoaW50IGkgPSB4IC0gMTsgaSA+PSAxOyAtLWkpCgkJewoJCQlpZih2YWxpZChpLCB5KSkKCQkJewoJCQkJZ3JpZFtpXVt5XSA9ICd4JzsKCQkJCWVuZCA9IGk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlhbnMucHVzaF9iYWNrKCJVUCIpOwoJCQoJCS8vUmVjdXJzZQoJCWlmKHNvbHZlKGVuZCwgeSkpCgkJCXJldHVybiAxOwoJCQoJCS8vVW5kbwoJCWZvcihpbnQgaSA9IGVuZDsgaSA8IHg7ICsraSkKCQkJZ3JpZFtpXVt5XSA9ICcuJzsKCQlhbnMucG9wX2JhY2soKTsKCX0KCWlmKHZhbGlkKHgsIHkgKyAxKSkKCXsKCQlpbnQgZW5kID0gbjsKCQkvL0RvCgkJZm9yKGludCBpID0geSArIDE7IGkgPD0gbjsgKytpKQoJCXsKCQkJaWYodmFsaWQoeCwgaSkpCgkJCXsKCQkJCWdyaWRbeF1baV0gPSAneCc7CgkJCQllbmQgPSBpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJYW5zLnB1c2hfYmFjaygiUmlnaHQiKTsKCQkKCQkvL1JlY3Vyc2UKCQlpZihzb2x2ZSh4LCBlbmQpKQoJCQlyZXR1cm4gMTsKCQkKCQkvL1VuZG8KCQlmb3IoaW50IGkgPSBlbmQ7IGkgPiB5OyAtLWkpCgkJCWdyaWRbeF1baV0gPSAnLic7CgkJYW5zLnBvcF9iYWNrKCk7Cgl9CglpZih2YWxpZCh4LCB5IC0gMSkpCgl7CgkJaW50IGVuZCA9IDE7CgkJLy9EbwoJCWZvcihpbnQgaSA9IHkgLSAxOyBpID49IDE7IC0taSkKCQl7CgkJCWlmKHZhbGlkKHgsIGkpKQoJCQl7CgkJCQlncmlkW3hdW2ldID0gJ3gnOwoJCQkJZW5kID0gaTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWFucy5wdXNoX2JhY2soIkxlZnQiKTsKCQkKCQkvL1JlY3Vyc2UKCQlpZihzb2x2ZSh4LCBlbmQpKQoJCQlyZXR1cm4gMTsKCQkKCQkvL1VuZG8KCQlmb3IoaW50IGkgPSBlbmQ7IGkgPCB5OyArK2kpCgkJCWdyaWRbeF1baV0gPSAnLic7CgkJYW5zLnBvcF9iYWNrKCk7Cgl9CglyZXR1cm4gMDsKfQppbnQgbWFpbigpCnsKCWNvdXQgPDwgIm5vdGU6IHRoaXMgY29kZSB3b3JrcyBvbiBhbiBOKk4gbWF0cml4IGFuZCBpcyAxLWJhc2VkXG4iOwoJY291dCA8PCAiZW50ZXIgdGhlIGdyaWQgc2l6ZSBcbiI7CgljaW4gPj4gbjsKCWNvdXQgPDwgImVudGVyIHRoZSBjb29yZGluYXRlIG9mIHRoZSB5LWF4aXMgXG4iOwoJY2luID4+IHBvc3k7Cgljb3V0IDw8ICJlbnRlciB0aGUgY29vcmRpbmF0ZSBvZiB0aGUgeC1heGlzIFxuIjsKCWNpbiA+PiBwb3N4OwoJLy9pbnB1dAoJZm9yKGludCBpID0gMSA7IGkgPD0gbiA7ICsraSkKCQlmb3IoaW50IGogPSAxOyBqIDw9IG47ICsraikKCQkJY2luID4+IGdyaWRbaV1bal07CgkKCS8vcHJvY2Vzc2luZwoJZ3JpZFtwb3N5XVtwb3N4XSA9ICd4JzsKCXNvbHZlKHBvc3ksIHBvc3gpOwoJCgkvL291dHB1dAoJaWYoYW5zLnNpemUoKSkKCQlmb3IoaW50IGkgPSAwIDsgaSA8IGFucy5zaXplKCk7ICsraSkKCQkJY291dCA8PCBhbnNbaV0gPDwgIiAiOwoJZWxzZQoJCXB1dHMoIkNhbnQiKTsKCXJldHVybiAwOwp9