MATLAB, 316305300 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,''];
아 그리고 항상 :
컨볼 루션은 성공의 열쇠입니다.