function mv = solver(ai,af,w)
nBlocks = max(ai(:));
[m,n] = size(ai);
% Make increment tables
% N=1, E=2, S=3, W=4
I = [0 1 0 -1];
J = [1 0 -1 0];
a = ai;
mv = [];
while ~isequal ( ai, af )
% pick a random block
block = ceil ( rand * nBlocks );
% where is this block located
[ brow, bcol ] = find ( a == block );
% where should the block go?
[ erow, ecol ] = find ( af == block );
% how far away are we?
rdist = abs ( brow - erow );
cdist = abs ( bcol - ecol );
% is the block in its correct spot?
if ( brow ~= erow | bcol ~= ecol )
% randomly pick a direction to move the block
direction = ceil ( rand * 4 );
% move it in that direction . . .
nrow = brow + I ( direction );
ncol = bcol + J ( direction );
% was it a valid move?
if ( nrow < 1 | nrow > m | ncol < 1 | ncol > n | a ( nrow, ncol ) ~= 0 )
continue;
end
% did we get closer to the goal?
nrdist = abs ( nrow - erow );
ncdist = abs ( ncol - ecol );
if ( nrdist > rdist | ncdist > cdist )
continue;
end
% it was a valid move!
a ( nrow, ncol ) = block;
a ( brow, bcol ) = 0;
mv ( end + 1, [ 1 2 ] ) = [ block direction ];
else
continue;
end
end
|