MATLAB、316 305 300 293バイト
function P=f(a,b);z(a,b)=0;P=z;c=@(X)conv2(+X,[0,1,0;1,1,1;0,1,0],'s');B=1;while B;P=z;P(1)=1;for K=1:a*b;S=z;S(a,b)=1;for L=2:a*b;S(~S&c(S)&~P)=L;end;[i,j]=find(S&c(P==K));if i;r=randi(nnz(i));else;break;end;P(i(r),j(r))=K+1;if P(a,b);break;end;end;B=any(any(c(P>0)>3));end;P(P>0)=35;P=[P,'']
@LuisMendoにさまざまな提案とたくさんのバイトをありがとう=)
オンラインでお試しください!(保証なし:Octaveで実行するには、いくつかの調整が必要であることに注意してください:まず、function
キーワードを削除して値をハードコードする必要がありました。次に、Matlabのようにスペースが正しく印刷されません。 Octaveの畳み込みコマンドを確認してください。これは異なる動作をする可能性があります。)
入力の出力例(7,10)
(すでにかなり時間がかかる場合があります):
#
#
##
##
# ###
# # ##
##### #
説明
これにより、目的の4接続性で左上から右下に順番にパスが生成され、拒否サンプリングを使用して、隣接するパーツを配置できないという基準に違反するパスが拒否されます。
function P=f(a,b);
z(a,b)=0; % a matrix of zeros of the size of th efield
P=z;
c=@(X)conv2(+X,[0,1,0;1,1,1;0,1,0],'s'); % our convolution function, we always convolute with the same 4-neighbourhood kernel
B=1;
while B; % while we reject, we generate paths:
P=z;
P(1)=1; % P is our path, we place the first seed
for K=1:a*b; % in this loop we generate the all shortest paths (flood fill) from the bottom right, withot crossing the path to see what fiels are reachable from the bottom left
S=z;
S(a,b)=1; % seed on the bottom left
for L=2:a*b;
S(~S&c(S)&~P)=L; % update flood front
end;
[i,j]=find(S&c(P==K)); % find a neighbour of the current end of the path, that is also reachable from the bottom left
if i; % if we found some choose a random one
r=randi(nnz(i));
else;
break; % otherwise restart (might not be necessary, but I'm too tired to think about it properly=)
end;
P(i(r),j(r))=K+1; % update the end of the current path
if P(a,b); % if we finished, stop continuing this path
break;
end;
end;
B=any(any(c(P>0)>3)); % check if we actually have a valid path
end;
P(P>0)=35; % format the path nicely
P=[P,''];
ああ、いつものように:
畳み込みは成功の鍵です。