description
設有乙個n×m(小於100)的方格(如圖所示),在方格中去掉某些點,方格中的數字代表距離(為小於100的數,如果為0表示去掉的點),試找出一條從a(左上角)到b(右下角)的路徑,經過的距離和為最小(此時稱為最小代價),從a出發的方向只能向右,或者向下。
sample input
4 4
4 10 7 0
3 2 2 9
0 7 0 4
11 6 12 1
sample output
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)
24首先現將最上面那行和最左邊那行定初值。
用f[i,j]來判斷這個點是否為0如果為0,則為true。
那麼我們就可以用兩重迴圈,來枚舉行和列。如果這個點可以走,那就判斷是從上面走下來比較下,還是從左邊走過來比較小。還要判斷左邊或上面是否為0。
f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j]);
如果從上面來,則d[i,j]=2;從左來則為1。
最後倒推回去,找到路線和最終的最小代價值。
**如下:
var i,j,n,m:longint;
a,k,d:array[-1..101,-1..101]of longint;
f:array[-1..101,-1..101]of boolean;
procedure
dg(x,y:longint);
begin
if (x=1)and(y=1) then
begin
write('(',x,',',y,')'); exit; end;
if d[x,y]=1
then dg(x,y-1) else dg(x-1,y);
write('->(',x,',',y,')');
end;
begin
readln(n,m);
fillchar(f,sizeof(f),false);
for i:=1
to n do
begin
for j:=1
to m do
begin
read(a[i,j]);
if a[i,j]=0
then
begin a[i,j]:=maxlongint; f[i,j]:=true; end;
k[i,j]:=maxlongint div
2; end;
readln;
end;
for i:=1
to m do
if f[1,i]=false
then
begin
k[1,i]:=k[1,i-1]+a[1,i];
d[1,i]:=1;
end;
for i:=2
to n do
if f[i,1]=false
then
begin
k[i,1]:=k[i-1,1]+a[i,1];
d[i,1]:=2;
endelse
break;
for i:=2
to n do
for j:=2
to m do
if f[i,j]=false
then
if ((k[i-1,j]+a[i,j])
begin
d[i,j]:=2;
k[i,j]:=k[i-1,j]+a[i,j];
endelse
if f[i,j-1]=false
then
begin
d[i,j]:=1;
k[i,j]:=k[i,j-1]+a[i,j];
end;
dg(n,m);
writeln;
writeln(k[n,m]-a[n,m]);
end.
SSL 1460 最小代價問題
description 設有乙個n m 小於100 的方格 如圖所示 在方格中去掉某些點,方格中的數字代表距離 為小於100的數,如果為0表示去掉的點 試找出一條從a 左上角 到b 右下角 的路徑,經過的距離和為最小 此時稱為最小代價 從a出發的方向只能向右,或者向下。sample input 4 ...
SSL1763 觀光旅遊 最小環問題
在相同的起點與終點之間找出一最短路線。你的任務是編寫一條程式來找類似的的一條路線。在這個鎮上,有n個十字路口 編號1至n 兩個十字路口之間可以有多條道路連線,有m條道路 編號為1至m 但沒有一條道路從乙個十字路口出發又回到同乙個路口。每一條觀光路線都是由一些路組成的,這些道路序號是 y1,yk,且k...
SSL 1612 最優佈線問題(最小生成樹)
description 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們之間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手...