PHP, 385 335 307 297 279270 270256 bytes
function c(&$m,$x,$r=-1,$l=-1,$d=0){if($r<0)$r=array_search(P,$m);$m[$l=$r]=V;if;$m[$r]=V;if(!in_array(T,$m))die;foreach([$r%$x?$r-1:-1,$m[$r-$x]?$r-$x:-1,$m[$r+$x]?$r+$x:-1,$r%$x<$x-1?$r+1:-1]as$o=>$n)if($n>=0&&$m[$n]$n>=0&$m[$n]!=M&&$m[$n]=M&$m[$n]!=V){echo LUDR[$o];c($m,$x,$n,$r,$o);}echo RDUL[$d];}
Try it online!Try it online!
Input is a one-dimensional array map and number of columns, example: c( $map, 13 );
.
Output is to STDOUT
as L,R,U and D
(doesn't save enough bytes to make it worth showing as numeric... I prefer the letters).
Or 242 bytes to output as numbers (but I prefer the letters).
This could stand a bit more golfing (and possibly a bit more cleverness).
function c( &$m, $x, $r=-1, $l=-1, $d=0 ) {
// locate starting position on first move
if( $r < 0 )
$r = array_search( 'P', $m );
// move to new square
$l = $r;
// mark square with .V to show it has been visited
$m[ $r ] = '.';'V';
// end if no more treasures
if ( ! in_array( 'T', $m ) )
exit;
// generate list of adjacent squares
$dirs = [
$r % $x ? $r - 1 : -1, // Left
$m[ $r - $x ] ? $r - $x : -1, // Up
$m[ $r + $x ] ? $r + $x : -1, // Down
$r % $x < $x - 1 ? $r + 1 : -1 // Right
];
// consider valid directions for next move
foreach ( $dirs as $o => $n )
// if not a Wall or Mountain and not Visited
if ( $n>=0 &&and $m[$n] != 'M' &&and $m[$n] != '.''V' ) {
// display the direction
echo 'LUDR'[ $o ];
// and recursively keep crawling
c( $m, $x, $n, $r, $o );
}
// reached a dead end, go back to previous square
echo 'RDUL'[ $d ]; // display the reverse direction
}
Basic CaseBasic Case