街道问题
(way.pas/c/cpp)
来源:《奥赛经典》(提高篇)
【问题描述】
如图所示的矩形图中找到一条从左下角到右上角的最短路径,图中数字表示边的长度。只能向右或向上走。
【输入文件】
第一行两个数,N,M 矩形的点有N行M列。(0<N,M<1000)
接下来N行每行M-1个数描述横向边的长度。
接下来N-1行每行M个数描述纵向边的长度。
边的长度小于10。
【输出文件】
【输入样例】
4 5
3 7 4 8
4 6 3 5
3 6 3 5
5 4 6 2
7 6 3 5 3
2 8 5 9 4
8 7 4 3 7
【输出样例】
====================
========================
{
ID:jie19952
PROG:
LANG:PASCAL
}
var
n,m:longint;
map_h,map_z:array[0..1001,0..1001]of longint;
f:array[0..1001,0..1001]of longint;
procedure init;
begin
assign(input,'way.in');
assign(output,'way.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function min(a,b:longint):longint;
begin
if a>b then exit(b);
exit(a);
end;
procedure main;
var
i,j:longint;
begin
readln(n,m);
for i:=1 to n do
for j:=2 to m do
read(map_h[i,j]);
for i:=1 to n-1 do
for j:=1 to m do
read(map_z[i,j]);
fillchar(f,sizeof(f),$7);
f[n,1]:=0;
for i:=n downto 1 do
for j:=1 to m do
begin
f[i-1,j]:=min(f[i-1,j],f[i,j]+map_z[i-1,j]);
f[i,j+1]:=min(f[i,j+1],f[i,j]+map_h[i,j+1]);
end;
writeln(f[1,m]);
end;
begin
init;
main;
terminate;
end.