เส้นทางที่เหมาะสมผ่านเมทริกซ์


19

รับเมทริกซ์ที่ประกอบด้วยจำนวนเต็มบวกเอาท์พุทพา ธ ด้วยผลรวมต่ำสุดเมื่อเคลื่อนที่จากองค์ประกอบบนซ้ายไปขวาล่าง คุณสามารถเคลื่อนที่ในแนวตั้งแนวนอนและแนวทแยงมุม โปรดทราบว่าเป็นไปได้ที่จะเลื่อนขึ้น / ลง, ขวา / ซ้ายและแนวทแยงมุมไปทุกด้าน

ตัวอย่าง:

 1*   9    7    3   10    2    2
10    4*   1*   1*   1*   7    8
 3    6    3    8    9    5*   7
 8   10    2    5    2    1*   4
 5    1    1    3    6    7    9*

เส้นทางให้ผลรวมต่ำสุดจะมีเครื่องหมายดอกจันและผลในผลรวมต่อไปนี้: 1 + 4 + 1 + 1 + 1 + 5 + 1 + 9 = 23

กรณีทดสอบ:

1   1   1
1   1   1
Output: 3

 7    9    6    6    4
 6    5    9    1    6
10    7   10    4    3
 4    2    2    3    7
 9    2    7    9    4
Output: 28

2  42   6   4   1
3  33   1   1   1
4  21   7  59   1
1   7   6  49   1
1   9   2  39   1
Output: 27 (2+3+4+7+7+1+1+1+1)

 5    6    7    4    4
12   12   25   25   25
 9    4   25    9    5
 7    4   25    1   12
 4    4    4    4    4
Output: 34 (5+12+4+4+4+1+4)

1   1   1   1
9   9   9   1
1   9   9   9
1   9   9   9
1   1   1   1
Output: 15

 2   55    5    3    1    1    4    1
 2   56    1   99   99   99   99    5
 3   57    5    2    2    2   99    1
 3   58    4    2    8    1   99    2
 4   65   66   67   68    3   99    3
 2    5    4    3    3    4   99    5
75   76   77   78   79   80   81    2
 5    4    5    1    1    3    3    2
Output: 67 (2+2+3+3+4+5+4+3+3+3+1+2+2+1+3+1+1+4+5+1+2+3+5+2+2)

นี่คือดังนั้นรหัสที่สั้นที่สุดในแต่ละภาษาชนะ


คล้ายกันมากแม้ว่าจะไม่อนุญาตให้มีการเคลื่อนไหวในแนวทแยง
Mego

7
@WheatWizard ฉันไม่เห็นด้วย นอกเหนือจากความแตกต่างผิวเผินส่วนใหญ่ที่ความท้าทายนี้อนุญาตให้มีการเคลื่อนไหวในแนวทแยงและตำแหน่งทั้งหมดสามารถเข้าถึงได้ความท้าทายอื่น ๆ ต้องการการกลับมาของเส้นทางตัวเองมากกว่าค่าใช้จ่ายของเส้นทาง หากคุณไม่ได้ใช้บิวด์อินที่ส่งคืนโค้ดนั้นจะไม่สามารถใช้แทนกันได้
บีกเกอร์

@ คนทำขนมปังฉันไม่เห็นความแตกต่าง คุณต้องหาเส้นทางที่จะรู้ความยาวของมัน ความแตกต่างที่นี่เป็นความเห็นที่แตกต่างกันเล็กน้อยในความคิดของฉันและความท้าทายนี้ไม่ได้มีอะไรใหม่หรือน่าสนใจที่ไม่รวมอยู่ในความท้าทายนั้น
ข้าวสาลีตัวช่วยสร้าง

1
@WheatWizard ทางออกของฉันที่นี่ไม่พบเส้นทาง มันสามารถค้นหาพา ธ แต่ไม่สามารถทำได้โดยไม่มีอาเรย์ก่อนหน้าและลอจิกที่แยกต่างหากเพื่อหลีกเลี่ยงการสร้างโหนดเป็นของตัวเอง ไม่ต้องพูดถึงการกู้คืนเส้นทางในตอนท้าย
บีกเกอร์

@beaker การปรับเปลี่ยนค่อนข้างเล็กน้อยในความคิดของฉัน โดยไม่คำนึงถึงคำถามของการดักจับไม่ได้ว่าทุกรายการที่ถูกต้องในการท้าทายหนึ่งสามารถพอร์ตไปด้วยความพยายามน้อยที่สุดมันเกี่ยวกับกรณีทั่วไป ไม่เพียง แต่ฉันคิดว่าความพยายามส่วนใหญ่ของที่นี่สามารถจัดวางได้ฉันไม่คิดว่าความท้าทายนี้นำเสนอสิ่งใหม่หรือน่าสนใจจากสิ่งอื่น
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


8

JavaScript, 442 412 408 358 ไบต์

นี่คือการส่ง PPCG ครั้งแรกของฉัน ข้อเสนอแนะจะได้รับการชื่นชม

(m,h=m.length,w=m[0].length)=>{for(i=0;i<h*w;i++)for(x=0;x<w;x++){for(y=0;y<h;y++){if(m[y][x]%1==0)m[y][x]={c:m[y][x],t:m[y][x]};for(X=-1;X<=1;X++)for(Y=-1;Y<=1;Y++){t=x+X;v=y+Y;if((X==0&&Y==0)||t<0||t>=w||v<0||v>=h)continue;if(m[v][t]%1==0)m[v][t]={c:m[v][t],t:null};c=m[y][x].t+m[v][t].c;if (c<m[v][t].t||m[v][t].t==null)m[v][t].t=c}}}return m[h-1][w-1].t}

สิ่งนี้ใช้อาเรย์หลายมิติเป็นอินพุต

คำอธิบาย

โดยทั่วไปวนลูปทั้งหมดของเซลล์ซ้ำไปซ้ำมาปรับค่าใช้จ่ายต่ำสุดที่รู้จักเพื่อไปยังแต่ละเพื่อนบ้าน ในที่สุดกริดจะไปถึงสถานะที่ค่าใช้จ่ายทั้งหมดในการเข้าถึงด้านล่างขวาคือราคาต่ำสุดที่จะไปถึงที่นั่น

การสาธิต

f=(m,h=m.length,w=m[0].length)=>{for(i=0;i<h*w;i++)for(x=0;x<w;x++){for(y=0;y<h;y++){if(m[y][x]%1==0)m[y][x]={c:m[y][x],t:m[y][x]};for(X=-1;X<=1;X++)for(Y=-1;Y<=1;Y++){t=x+X;v=y+Y;if((X==0&&Y==0)||t<0||t>=w||v<0||v>=h)continue;if(m[v][t]%1==0)m[v][t]={c:m[v][t],t:null};c=m[y][x].t+m[v][t].c;if (c<m[v][t].t||m[v][t].t==null)m[v][t].t=c}}}return m[h-1][w-1].t}

//Tests
console.log(f([[1,1,1],[1,1,1]])===3);
console.log(f([[7,9,6,6,4],[6,5,9,1,6],[10,7,10,4,3],[4,2,2,3,7],[9,2,7,9,4]])===28);
console.log(f([[2,42,6,4,1],[3,33,1,1,1],[4,21,7,59,1],[1,7,6,49,1],[1,9,2,39,1]])===27);
console.log(f([[5,6,7,4,4],[12,12,25,25,25],[9,4,25,9,5],[7,4,25,1,12],[4,4,4,4,4]])===34); 
console.log(f([[1,1,1,1],[9,9,9,1],[1,9,9,9],[1,9,9,9],[1,1,1,1]])===15)
console.log(f([[2,55,5,3,1,1,4,1],[2,56,1,99,99,99,99,5],[3,57,5,2,2,2,99,1],[3,58,4,2,8,1,99,2],[4,65,66,67,68,3,99,3],[2,5,4,3,3,4,99,5],[75,76,77,78,79,80,81,2],[5,4,5,1,1,3,3,2]])===67);

แก้ไข: ขอขอบคุณเป็นพิเศษสำหรับ@ETHproductions ที่ช่วยให้ฉันโกนหนวดได้หลายสิบไบต์

ขอขอบคุณ@Stewie Griffinสำหรับเคล็ดลับของคุณที่ล้มลงไป 50 ไบต์


3
ยินดีต้อนรับสู่ PPCG! มีช่องว่างเพิ่มเติมบางส่วนที่คุณสามารถลบไปยังจุดสิ้นสุด (ฉันนับรวม 5) และคุณไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคโดยตรงก่อน}ที่จะบันทึกสองสามไบต์ คุณไม่จำเป็นต้องประกาศตัวแปรของคุณ ฉันคิดว่าการลบvars ควรจะช่วยให้คุณประหยัดได้อีก 24 ไบต์
ETHproductions

2
ยินดีต้อนรับสู่ PPCG =) ฉันดีใจที่คุณเลือกหนึ่งในความท้าทายของฉันเป็นจุดเริ่มต้น ความคิดเห็นเดียวของฉัน: ฉันรักคำอธิบาย แม้ว่าจะเป็นตัวเลือกก็ตามดังนั้นคุณไม่จำเป็นต้องเพิ่มเว้นแต่คุณต้องการ :)
Stewie Griffin

ฉันคิดว่าการเก็บm[v][t]เป็นตัวแปรt=x+X;v=y+Y;k=m[v][t]อาจจะสั้นกว่านี้ ...
Stewie Griffin


6

แพคเกจการประมวลผลระดับแปดเสียง +, 175 162 157 151 142 139 ไบต์

บันทึกแล้ว 14 ไบต์ขอบคุณ@Luis Mendoและ 1 ไบต์ขอบคุณ@notjagan

function P(G)A=inf(z=size(G));A(1)=G(1);for k=G(:)'B=im2col(padarray(A,[1,1],inf),[3,3])+G(:)';B(5,:)-=G(:)';A=reshape(min(B),z);end,A(end)

ใช้แพ็คเกจการประมวลผลภาพเพราะเหตุใด นั่นไม่ใช่วิธีที่ทุกคนแก้ปัญหากราฟหรือไม่

ลองออนไลน์!

ระเบิด

function P(G)
   A=inf(z=size(G));         % Initialize distance array to all Inf
   A(1)=G(1);                % Make A(1) = cost of start cell
   for k=G(:)'               % For a really long time...
      B=im2col(padarray(A,[1,1],inf),[3,3])+G(:)';
       %  B=padarray(A,[1,1],inf);     % Add border of Inf around distance array
       %  B=im2col(B,[3,3]);           % Turn each 3x3 neighborhood into a column
       %  B=B+G(:)';                   % Add the weights to each row
      B(5,:)-=G(:)';         % Subtract the weights from center of neighborhood
      A=reshape(min(B),z);   % Take minimum columnwise and reshape to original
   end
   A(end)                    % Display cost of getting to last cell

คำอธิบาย

รับน้ำหนักมากมาย:

7   12    6    2    4
5   13    3   11    1
4    7    2    9    3
4    2   12   13    4
9    2    7    9    4

เริ่มต้นอาร์เรย์ต้นทุนเพื่อให้ต้นทุนในการเข้าถึงทุกองค์ประกอบคืออินฟินิตี้ยกเว้นจุดเริ่มต้น (องค์ประกอบด้านซ้ายบน) ซึ่งมีค่าเท่ากับน้ำหนักของมัน

  7   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf

นี่คือการวนซ้ำ 0 สำหรับการวนซ้ำแต่ละครั้งค่าใช้จ่ายในการเข้าถึงเซลล์จะถูกกำหนดเป็นค่าต่ำสุด:

  • ต้นทุนปัจจุบันในการเข้าถึงองค์ประกอบนั้นและ
  • ค่าใช้จ่ายปัจจุบันในการเข้าถึงเพื่อนบ้านขององค์ประกอบ + น้ำหนักขององค์ประกอบ

หลังจากการทำซ้ำครั้งแรกค่าใช้จ่ายของเส้นทางไปยังองค์ประกอบ (2,2) (โดยใช้การจัดทำดัชนีแบบ 1) จะเป็น

minimum([  7   Inf   Inf]   [13  13  13]) = 20
        [Inf   Inf   Inf] + [13   0  13]
        [Inf   Inf   Inf]   [13  13  13]

อาร์เรย์ราคาเต็มหลังจากการทำซ้ำครั้งแรกจะเป็น:

  7    19   Inf   Inf   Inf
 12    20   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf

หลังจากการวนซ้ำkแต่ละองค์ประกอบจะมีค่าใช้จ่ายต่ำที่สุดในการเข้าถึงองค์ประกอบนั้นตั้งแต่เริ่มต้นจนถึงkขั้นตอนส่วนใหญ่ ตัวอย่างเช่นองค์ประกอบที่ (3,3) สามารถเข้าถึงได้ใน 2 ขั้นตอน (การทำซ้ำ) ในราคา 22:

  7    19    25   Inf   Inf
 12    20    22   Inf   Inf
 16    19    22   Inf   Inf
Inf   Inf   Inf   Inf   Inf
Inf   Inf   Inf   Inf   Inf

แต่ในการทำซ้ำครั้งที่ 4 จะพบเส้นทางของ 4 ขั้นตอนด้วยราคา 20:

 7   19   25   24   28
12   20   22   32   25
16   19   20   30   34
20   18   30   34   35
27   20   25   40   39

เนื่องจากไม่มีเส้นทางผ่านเมทริกซ์mxnจึงสามารถยาวกว่าจำนวนขององค์ประกอบในเมทริกซ์ (เป็นขอบเขตบนที่หลวมมาก) หลังจากm*nการวนซ้ำทุกองค์ประกอบจะมีค่าใช้จ่ายของเส้นทางที่สั้นที่สุดในการเข้าถึงองค์ประกอบนั้นตั้งแต่เริ่มต้น


-1 ไบต์โดยการลบช่องว่างระหว่างและwhile ~
notjagan

@notjagan ฉันเปลี่ยนจากwhileเป็นforและยังสามารถใช้เคล็ดลับของคุณได้ ขอบคุณ!
บีกเกอร์

5

JavaScript, 197 ไบต์

a=>(v=a.map(x=>x.map(_=>1/0)),v[0][0]=a[0][0],q=[...(a+'')].map(_=>v=v.map((l,y)=>l.map((c,x)=>Math.min(c,...[...'012345678'].map(c=>a[y][x]+((v[y+(c/3|0)-1]||[])[x+c%3-1]||1/0)))))),v.pop().pop())

เสริมสวย:

a=>(
  // v is a matrix holds minimal distance to the left top
  v=a.map(x=>x.map(_=>1/0)),
  v[0][0]=a[0][0],
  q=[
     // iterate more than width * height times to ensure the answer is correct
    ...(a+'')
  ].map(_=>
    v=v.map((l,y)=>
      l.map((c,x)=>
        // update each cell
        Math.min(c,...[...'012345678'].map(
          c=>a[y][x]+((v[y+(c/3|0)-1]||[])[x+c%3-1]||1/0)
        ))
      )
    )
  ),
  // get result at right bottom
  v.pop().pop()
)

4

Mathematica 279 Bytes

แนวคิดพื้นฐานคือการสร้างกราฟที่มีจุดยอดที่สอดคล้องกับรายการเมทริกซ์และขอบกำกับระหว่างจุดสองจุดใด ๆ ที่คั่นด้วยChessboardDistanceศูนย์มากกว่า แต่น้อยกว่าหรือเท่ากับ 1 โดยบังเอิญสิ่งนี้เกิดขึ้นเป็นที่รู้จักกันในชื่อกราฟกษัตริย์เนื่องจากสอดคล้องกับ การเคลื่อนไหวที่ถูกต้องของราชาบนกระดานหมากรุก

FindShortestPathจะถูกใช้เพื่อให้ได้พา ธ ที่น้อยที่สุด ใช้งานEdgeWeightได้ไม่ใช่VertexWeightมีโค้ดพิเศษบางรายการที่จะกำหนดEdgeWeightเป็นรายการเมทริกซ์ที่สอดคล้องกับปลายทางของแต่ละขอบชี้นำ

รหัส:

(m=Flatten[#];d=Dimensions@#;s=Range[Times@@d];e=Select[Tuples[s,2],0<ChessboardDistance@@(#/.Thread[s->({Ceiling[#/d[[1]]],Mod[#,d[[1]],1]}&/@s)])≤1&];Tr[FindShortestPath[Graph[s,#[[1]]->#[[2]]&/@e,EdgeWeight->(Last@#&/@Map[Extract[m,#]&,e,{2}])],1,Last@s]/.Thread[s->m]])&

โปรดทราบว่าตัวละครเป็นสัญลักษณ์ขนย้าย มันจะวางลงใน Mathematica ตามที่เป็นอยู่

การใช้งาน:

%@{{2, 55, 5, 3, 1, 1, 4, 1},
  {2, 56, 1, 99, 99, 99, 99, 5},
  {3, 57, 5, 2, 2, 2, 99, 1},
  {3, 58, 4, 2, 8, 1, 99, 2},
  {4, 65, 66, 67, 68, 3, 99, 3},
  {2, 5, 4, 3, 3, 4, 99, 5},
  {75, 76, 77, 78, 79, 80, 81, 2},
  {5, 4, 5, 1, 1, 3, 3, 2}}

เอาท์พุท:

67

ถ้าคุณตั้งค่าg=Graph[...,GraphLayout->{"GridEmbedding","Dimension"->d},VertexLabels->Thread[s->m]และp=FindShortestPath[...แล้วภาพต่อไปนี้สายตาจะแสดงวิธีการแก้ปัญหา (ด้านบนของเมทริกซ์ตรงไปที่ด้านล่างของกราฟ):

HighlightGraph[g,PathGraph[p,Thread[Most@p->Rest@p]]]

ป้อนคำอธิบายรูปภาพที่นี่


3

Haskell, 228 ไบต์

ตำแหน่งคือรายการของสององค์ประกอบเนื่องจากสิ่งเหล่านั้นสร้างได้ง่ายด้วยsequenceและง่ายต่อการจับคู่รูปแบบเป็น 2-tuples

h=g[[-1,-1]]
g t@(p:r)c|p==m=0|1<2=minimum$(sum$concat c):(\q@[a,b]->c!!a!!b+g(q:t)c)#(f(e$s$(\x->[0..x])#m)$f(not.e t)$zipWith(+)p#s[[-1..1],[-1..1]])where m=[l(c)-1,l(head c)-1]
(#)=map
f=filter
e=flip elem
s=sequence
l=length

เริ่มต้น-1,-1และนับค่าใช้จ่ายของแต่ละฟิลด์ปลายทาง

ทางเลือกสองบรรทัดแรก: เริ่มต้น0,0นับเขตข้อมูลออกเดินทางยุติที่พิกัดเท่ากับมิติของเมทริกซ์ (ดังนั้นจากขวาไปยังเป้าหมายซึ่งต้องเพิ่มลงในรายการของปลายทางทางกฎหมาย) - ความยาวเท่ากัน แต่ช้ากว่า:

j=i[[0,0]]
i t@(p@[a,b]:r)c|p==m=0|1<2=c!!a!!b+(minimum$(sum$concat c):(\q->i(q:t)c)#(f(e$m:(s$(\x->[0..x-1])#m))$f(not.e t)$zipWith(+)p#s[[-1..1],[-1..1]]))where m=[l c,l$head c]

การใช้มัดสำหรับ mapไม่ได้บันทึกไบต์ที่นี่ แต่ฉันแทนที่มันทันทีที่มันไม่เสียค่าใช้จ่ายเพราะมันจะดีขึ้นเมื่อมีการใช้มากขึ้นและบางครั้งก็มีการปรับโครงสร้างอื่น ๆ เช่นกันซึ่งโกนวงเล็บคู่อื่น

จะได้รับการปรับปรุงให้ดีขึ้น: Redundant filters การผสาน / ซับเข้าfilter(flip elem$(s$(\x->[0..x])#m)\\p)ด้วยกันimport Data.Listเพื่อ\\ค่าใช้จ่าย 3 ไบต์

นอกจากนี้เลวร้ายเกินไป(fromEnumTo 0)คือ 2 (\x->[0..x])ไบต์นานกว่า

sum$concat cเป็นค่าใช้จ่ายทั้งหมดของเขตข้อมูลสรุปและทำให้มีขอบเขตบนที่ชัดเจนอย่างชัดเจนเกี่ยวกับค่าใช้จ่ายเส้นทางที่มอบให้กับminimumเพื่อหลีกเลี่ยงรายการที่ว่างเปล่า (ตัวตรวจสอบชนิดของฉันได้กำหนดสิ่งทั้งหมดเพื่อทำงานกับIntegers แล้วดังนั้นจึงไม่มีการเข้ารหัสสูงสุด , ฮิฮิ). ไม่ว่าฉันจะ จำกัด ขั้นตอนตามขั้นตอนก่อนหน้านี้อย่างไร (ซึ่งจะทำให้อัลกอริทึมเร็วขึ้น แต่ก็มีค่าใช้จ่ายเป็นจำนวนไบต์ด้วย) ฉันไม่สามารถหลีกเลี่ยงปลายตายที่ทำให้การถอยกลับจำเป็น

  • หนึ่งแนวคิดกรองคือการ((not.e n).zipWith(-)(head r))แยกn=s[[-1..1],[-1..1]]ซึ่งจำเป็นต้องเพิ่ม,[-1,-1]ไปยังเส้นทางเริ่มต้น จากนั้นอัลกอริทึมจะหลีกเลี่ยงการไปในที่ที่มันสามารถผ่านไปแล้วในขั้นตอนก่อนหน้าซึ่งทำให้การเหยียบบนขอบสนามตั้งฉากกับขอบนั้นจนจบ

  • อีกประการหนึ่งคือ((>=0).sum.z(*)d)ด้วยการแยกz=zipWithซึ่งจะแนะนำอาร์กิวเมนต์ใหม่dให้กับฟังก์ชั่นแบบเรียกซ้ำที่ให้ไว้(z(-)p q)ในการเรียกซ้ำและ[1,1]ในกรณีเริ่มต้น อัลกอริทึมหลีกเลี่ยงขั้นตอนต่อเนื่องกับผลิตภัณฑ์สเกลาร์เชิงลบ ( dเป็นขั้นตอนก่อนหน้า) ซึ่งหมายความว่าไม่มีความคมชัด 45 ° สิ่งนี้ยังคงแคบลงทางเลือกมากและหลีกเลี่ยงการสิ้นตายเล็กน้อยก่อนหน้านี้ แต่ยังมีเส้นทางที่จบลงด้วยการปิดล้อมในเขตข้อมูลที่เยี่ยมชมแล้ว (และอาจเป็น 'การหลบหนี' ซึ่งอาจจะเลี้ยวที่คมชัด)


3

Python 2, 356 320 bytes

s=input()
r=lambda x:[x-1,x,x+1][-x-2:]
w=lambda z:[z+[(x,y)]for x in r(z[-1][0])for y in r(z[-1][1])if x<len(s)>0==((x,y)in z)<len(s[0])>y]
l=len(s)-1,len(s[0])-1
f=lambda x:all(l in y for y in x)and x or f([a for b in[l in z and[z]or w(z)for z in x]for a in b])
print min(sum(s[a][b]for(a,b)in x)for x in f([[(0,0)]]))

ลองที่นี่!

-36 ไบต์ขอบคุณnotjagan !

รับรายการของรายการเป็นอินพุตและส่งออกต้นทุนที่ต่ำที่สุดเมื่อนำทางเมทริกซ์จากซ้ายบนไปยังด้านล่างขวา

คำอธิบาย

ค้นหาเส้นทางที่เป็นไปได้ทุกเส้นทางจากด้านบนซ้ายไปด้านล่างขวาของเมทริกซ์สร้างรายการพิกัด x, y สำหรับแต่ละเส้นทาง เส้นทางไม่สามารถย้อนกลับได้และต้องสิ้นสุดที่(len(s)-1,len(s[0])-1)เส้นทางที่ไม่สามารถเปลี่ยนใจและพวกเขาต้องสิ้นสุด

รวมจำนวนเต็มในแต่ละเส้นทางของพิกัดและคืนค่าใช้จ่ายขั้นต่ำ

printสามารถเปลี่ยนแปลงได้อย่างง่ายดายเพื่อการส่งออกรายชื่อของพิกัดสำหรับเส้นทางที่สั้นที่สุด


-36 ไบต์ที่มีการเปลี่ยนแปลงอื่น ๆ
notjagan

@notjagan การเปลี่ยนแปลงครั้งใหญ่โดยเฉพาะอย่างยิ่งการใช้orสำหรับเงื่อนไข ขอขอบคุณ!
ละลาย

1

APL (Dyalog Classic) , 33 ไบต์

{⊃⌽,(⊢⌊⍵+(⍉3⌊/⊣/,⊢,⊢/)⍣2)⍣≡+\+⍀⍵}

ลองออนไลน์!

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง

+\+⍀⍵ นำผลรวมบางส่วนโดยแถวและคอลัมน์เพื่อสร้างขอบเขตบนในแง่ร้ายในระยะทางเส้นทาง

( )⍣≡ ทำซ้ำจนกระทั่งบรรจบ:

  • (⍉3⌊/⊣/,⊢,⊢/)⍣2ขั้นต่ำของระยะทางสู่เพื่อนบ้านคือทำสองครั้ง ( ( )⍣2): เพิ่มคอลัมน์ซ้ายสุด ( ⊣/,) ไปยังตนเอง ( ) และต่อท้ายคอลัมน์ทางขวาสุด ( ,⊢/), ค้นหา minima ใน triples แนวนอน ( 3⌊/) และ transpose ( )

  • ⍵+ เพิ่มมูลค่าของแต่ละโหนดให้ min ของระยะทางไปยังเพื่อนบ้าน

  • ⊢⌊ พยายามเอาชนะระยะทางที่ดีที่สุดในปัจจุบัน

⊃⌽, ในที่สุดก็กลับเซลล์ด้านล่างขวา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.