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
คำหลักและ hardcode ค่า, ประการที่สอง: ช่องว่างไม่ได้พิมพ์อย่างถูกต้องเช่นเดียวกับใน Matlab ฉันยังไม่ ตรวจสอบคำสั่ง convolution ของ 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,''];
โอ้และเช่นเคย:
Convolution คือกุญแจสู่ความสำเร็จ