গণিত 745 681 বাইট
প্রাথমিক ধারণাটি সম্ভাব্য পদক্ষেপের একটি ভারী গ্রাফ তৈরি করা। ওজন হ'ল সময় যা এক জায়গা থেকে অন্য জায়গায় যেতে সময় নেয়। কমপক্ষে ওজনযুক্ত পথটি দ্রুততর হবে।
ইনপুট অঙ্কগুলি একটি r দ্বারা c (কলাম দ্বারা সারি) আয়তক্ষেত্রাকার অ্যারে স্থাপন করা হয় এবং তারপরে তিনটি স্বতন্ত্র উপস্থাপনা খেলতে আসে: (1) সি গ্রিড গ্রাফ দ্বারা একটি আর, যেখানে প্রতিটি শীর্ষবিন্দু অ্যারের একটি ঘরের সাথে মিলিত হয়, (2) (আর সি) দ্বারা (আর সি) ওজনযুক্ত সংলগ্ন ম্যাট্রিক্স যা একটি অবস্থান থেকে (গ্রিড গ্রাফে) অন্য স্থানে যেতে সময় (২, ৩, বা ১১ মিনিট) সময় লাগে তার সাথে সামঞ্জস্য রেখে ওজন ধরে রাখে এবং (৩) নির্দেশিত , ম্যাট্রিক্স থেকে নির্মিত ওজনযুক্ত সংলগ্ন গ্রাফ।
গ্রিড গ্রাফটি নির্ধারণ করতে সহায়তা করে যে কোন কোষগুলি (অর্থাত্ কোনটি শীর্ষে অবস্থিত) প্রতিটি শীর্ষবিন্দু থেকে সম্ভবত পৌঁছনীয় - "সম্ভবত" পৌঁছনীয় "কারণ প্রতিবেশী সেলটি প্রদত্ত ঘরের উপরে কেবল ডান, বাম, নীচে বা নীচে থাকা উচিত নয়। এর মানটি প্রতিবেশী থেকে দূরত্বের 1 এককের মধ্যেও হওয়া আবশ্যক (উদাহরণস্বরূপ, 3 টি প্রতিবেশী 5 বা 1 এর সাথে সংযুক্ত হয় না)। যদি প্রান্তকে ভার্টেক্সের a
সাথে সংযুক্ত না হয় b
তবে সংলগ্ন ম্যাট্রিক্স কোষ cells a, b} এবং {b, a} এর মান হবে ∞ তদনুসারে, ওজনযুক্ত সংলগ্ন গ্রাফের a থেকে b পর্যন্ত কোনও প্রান্ত থাকবে না, খ থেকে a- তে হবে না।
ওজনযুক্ত সংলগ্ন গ্রাফ GraphDistance
যে কোনও শীর্ষে অবস্থিত সর্বনিম্ন দূরত্ব ( ) এবং সংক্ষিপ্ততম রুট নির্ধারণ করতে পরিবেশন করে । সর্বোত্তম পথটি অবশ্যই 1 দিয়ে শুরু হওয়া উচিত, প্রতিটি শৃঙ্গার প্রতিটি স্পর্শ করুন এবং 1 এ ফিরে আসতে হবে এই ক্ষেত্রে, "সংক্ষিপ্ততম রুট" খুব কম গতিপথ সহকারে এক নয়। প্রান্ত ওজনে পরিমাপ করা সবচেয়ে কম সময়ের সামগ্রিক সময়ের সাথে এটি।
Golfed
o=Sequence;v[a_<->b_,z_]:=(m_~u~q_:={Quotient[m-1,q[[2]]]+1,1+Mod[m-1, q[[2]]]};j=z[[o@@u[a,i=Dimensions@z]]];k=z[[o@@u[b,i]]];Which[j==k,{{a,b}->3,{b,a}->3},j==k-1,{{a,b}->11,{b,a}->2},j==k+1,{{a,b}->2,{b,a}->11},2<4,{{a,b}->∞, {b, a}->∞}]);w@e_:=Module[{d,x,l,y},x=Map[ToExpression,Characters/@Drop[StringSplit@e,2],{2}];d_~l~c_:=d[[2]](c[[1]]-1)+c[[2]];g_~y~p_:=(Min[Plus@@(GraphDistance[g,#,#2]&@@@#)&/@(Partition[#,2,1]&/@({1,o@@#,1}&/@Permutations@p))]);y[WeightedAdjacencyGraph[ReplacePart[ConstantArray[∞,{t=Times@@(d=Dimensions@x),t}],Flatten[#~v~x &/@Union@Flatten[EdgeList[GridGraph@Reverse@d,#<->_]&/@Range@(Times@@d),1],1]]], l[Dimensions@x, #] & /@ Position[x, Max@x]]
দীর্ঘতর, আরও পঠনযোগ্য ফর্ম
(*determines a weight (number of minutes) to go from vertex a to b and from b to a*)
weight[a_ <-> b_, dat_]:=
Module[{cellA,cellB,dim,valA,valB,vertexToCell},
(*Convert graph vertex index to cell location*)
vertexToCell[m_,dimen_]:={Quotient[m-1,dim[[2]]]+1,1+Mod[m-1,dimen[[2]]]};
dim=Dimensions[dat];
cellA = vertexToCell[a,dim];
cellB = vertexToCell[b,dim];
valA=dat[[Sequence@@cellA]];
valB=dat[[Sequence@@cellB]];
Which[
valA==valB,{{a,b}-> 3,{b,a}-> 3},
valA==valB-1,{{a,b}-> 11,{b,a}-> 2},
valA==valB+1,{{a,b}-> 2,{b,a}-> 11},
2<4,{{a,b}->∞,{b,a}->∞}]];
(* weights[] determines the edge weights (times to get from one position to the next), makes a graph and infers the shortest distance
from vertex 1 to each peak and back. It tries out all permutations of peaks and
selects the shortest one. Finally, it returns the length (in minutes) of the shortest trip. *)
weights[str_]:=
Module[{d,dat,neighbors,cellToVertex,peaks,z,gd},
dat=Map[ToExpression,Characters/@Drop[StringSplit[str],2],{2}];
cellToVertex[dim_,cell_]:=dim[[2]] (cell[[1]]-1)+cell[[2]];
peaks[dat_]:= cellToVertex[Dimensions[dat],#]&/@Position[dat,peak =Max[dat]];
(* to which cells should each cell be compared? neighbors[] is a function defined within weights[]. It returns a graph, g, from which graph distances will be derived in the function gd[] *)
neighbors[dim_]:=
Union@Flatten[EdgeList[GridGraph[Reverse@dim],#<->_]&/@Range@(Times@@dim),1];
d=Dimensions[dat];
m=ReplacePart[ConstantArray[∞,{t=Times@@d,t}],
(*substitutions=*)
Flatten[weight[#,dat]&/@neighbors[d],1]];
g=WeightedAdjacencyGraph[m,VertexLabels->"Name",ImageSize->Full,GraphLayout->"SpringEmbedding"];
(* finds shortest path. gd[] is also defined within weights[] *)
gd[g3_,ps_]:=
Module[{lists,pairs},
pairs=Partition[#,2,1]&/@({1,Sequence@@#,1}&/@Permutations@ps);
Min[Plus@@(GraphDistance[g3,#,#2]&@@@#)&/@pairs]];
gd[g,peaks[dat]]]
টেস্ট
weights["4 5
32445
33434
21153
12343"]
96।
weights@"2 7
6787778
5777679"
75।
weights@"3 4
1132
2221
1230"
51।
ব্যাখ্যা
নিম্নলিখিত ইনপুটটির 2-5 লাইনগুলি ভাবেন
"4 5
32445
33434
21153
12343"
4 টি সারি এবং 5 কলাম সহ একটি অ্যারে উপস্থাপন করে:
যেখানে প্রতিটি ভার্টেক্স ইনপুট অ্যারে থেকে একটি অঙ্কের সাথে মিলে যায়: 3টি ভার্টেক্স 1 এ, 2টি শীর্ষবিন্দু 2 এ, 4 টি 4 টি শীর্ষে 4, 5 আরও অন্যটি 4, 5টি ভার্টেক্স 5 এ, ইত্যাদি গ্রিড গ্রাফটি কেবল মোটামুটি আমরা যে গ্রাফটির জন্য লক্ষ্য রেখেছি তার অনুমান। এটি পুনর্নির্দেশিত হয়। তদুপরি, কিছু কিনারা অনুপলব্ধ থাকবে। (মনে রাখবেন: আমরা একটি অবস্থান থেকে অন্য স্থানে যেতে পারি না যা বর্তমানের 1 বা তারও নীচে 1 উচ্চতা এককের বেশি।) তবে গ্রিড গ্রাফটি সহজেই আমাদের বেছে নেওয়া যেকোনও উল্লম্বগুলি যেকোন নির্বাচিত প্রান্তের পাশে রয়েছে। এটি আমাদের বিবেচনার প্রয়োজন প্রান্তগুলি হ্রাস করে, প্রথম উদাহরণে (একটি 4 বাই 5 গ্রিড), 400 (20 * 20) থেকে 62 (31 * 2 গ্রিড গ্রাফের প্রান্তের সংখ্যা)। একই উদাহরণে, কেবলমাত্র 48 টি প্রবাহ অপারেটিভ; 14 হয় না।
নিম্নলিখিত 20 বাই 20 ওজনযুক্ত সংলগ্ন ম্যাট্রিক্স গ্রিড গ্রাফ থেকে সমস্ত জোড়ের মধ্যকার দূরত্বের প্রতিনিধিত্ব করে।
কী কোডটি নির্ধারণ করবে কোন নম্বরটি নির্ধারণ করবে তা নীচে is
Which[
valA==valB,{{a,b}-> 3,{b,a}-> 3},
valA==valB-1,{{a,b}-> 11,{b,a}-> 2},
valA==valB+1,{{a,b}-> 2,{b,a}-> 11},
2<4,{{a,b}->∞,{b,a}->∞}]
সেল {1,2} - এক সূচকগুলিতে-- 2 মান রয়েছে কারণ শীর্ষবিন্দু 1 থেকে শীর্ষস্থান 2 এ সরানো উতরাই। সেল {2,1 11 এ 11 টি রয়েছে কারণ ভার্টেক্স 2 থেকে শীর্ষস্থান 1 এ স্থানান্তরিত হয়। Cells 1,6 cells এবং 6,1 {কোষে থাকা 3 টি বোঝায় যে আন্দোলনটি উপরে বা নীচে নেই। সেলটিতে {1,1} রয়েছে ∞ কারণ এটি নিজের সাথে সংযুক্ত নয়।
নিম্নলিখিত গ্রাফ উপরের ইনপুট অন্তর্নিহিত কাঠামো দেখায়। রঙিন তীরগুলি শীর্ষস্থান 1 থেকে শিখর (5 এবং 14 এ) এবং পিছনে 1 পর্যন্ত সর্বোত্তম পথ দেখায় নীল তীরগুলি একই স্তরের (3 মিনিট) চলার সাথে সামঞ্জস্য করে; লাল তীরগুলির অর্থ আসমান (11 মিনিট) এবং সবুজ তীরগুলি নীচে (2 মিনিট) নির্দেশ করে।
শীর্ষবিন্দু 1 (সেল {1,1 from থেকে দুটি শিখরে এবং শীর্ষস্থান 1 এ ফিরে যাওয়ার পথ:
3 + 3 + 11 + 3 + 3 + 11 + 2 + 2 + 3 + 11 + 11 + 2 + 2 + 2 + 2 + 11 + 11 + 3
96