{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,R+,S+,V+,X-} {$M 16384,0,655360} Var f:text; n,m,i,j,s1,a1,s2,a2,ei,ej,ir:integer; h:array[1..20,1..20] of integer; mx:array[1..20,1..20,1..4] of real; szur:array[0..400,1..2] of byte; tav:array[0..21,0..21] of real; ut:array[1..20,1..20,1..2] of byte; veger:string; elso:boolean; Function FStr(a:integer):string; var x:string; begin Str(a,x); FStr:=x; end; Function da(ir:integer):integer; begin Case ir of 1,3: da:=0; 2: da:=1; 4:da:=-1; end; end; Function ds(ir:integer):integer; begin Case ir of 2,4: ds:=0; 3: ds:=1; 1:ds:=-1; end; end; Procedure Ciklus; begin If ei>0 Then begin If h[i,j]-h[ei,ej]<=10 Then mx[ei,ej,ir]:=Sqrt(10000+Sqr(h[i,j]-h[ei,ej])); { Ez egy kicsit bonyolultabb feladat, az eredetin‚l itt egyszerûen :=1 kell. } end; ei:=i; ej:=j; end; Procedure Kiir; var i,j,f1,f2:integer; begin f1:=s2; f2:=a2; veger:=FStr(f1)+'-'+FStr(f2); Repeat i:=ut[f1,f2,1]; j:=ut[f1,f2,2]; veger:=FStr(i)+'-'+FStr(j)+' to '+veger; f1:=i; f2:=j; Until (i=s1) and (j=a1); end; Procedure Algo; var j,n,f1,f2:integer; t:real; vege:boolean; begin If (a1=a2) and (s1=s2) Then veger:='To get from '+FStr(a1)+'-'+FStr(s1)+' to '+FStr(a1)+'-'+FStr(s1)+', stay put!' Else begin f1:=s1; f2:=a1; tav[s1,a1]:=0; ut[s1,a1,1]:=0; vege:=false; Repeat For j:=1 To 4 Do If (mx[f1,f2,j]>0) and (tav[f1+ds(j),f2+da(j)]>tav[f1,f2]+mx[f1,f2,j]) Then begin If tav[f1+ds(j),f2+da(j)]=999999 Then begin szur[szur[0,1],1]:=f1+ds(j); szur[szur[0,1],2]:=f2+da(j); Inc(szur[0,1]); end; tav[f1+ds(j),f2+da(j)]:=tav[f1,f2]+mx[f1,f2,j]; ut[f1+ds(j),f2+da(j),1]:=f1; ut[f1+ds(j),f2+da(j),2]:=f2; end; If szur[0,1]>1 Then begin t:=999999; For j:=1 To szur[0,1]-1 Do If tav[szur[j,1],szur[j,2]]0 Then begin ei:=0; If s1>s2 Then ir:=1; If s1a2 Then ir:=4; If a10) Then WriteLn Else elso:=false; For i:=1 To 20 Do For j:=1 To 20 Do tav[i,j]:=999999; szur[0,1]:=1; If s1>0 Then Algo; Until s1=0; Close(f); END.