走迷宫问题
[题目描述] 有一个n*n的迷宫,每个方格里都有着相应的数字。你从左上角出发,每次可以向上下左右四个方向最多移动k格,并且要求你每次到达的方格里的数字必须大于上一次所在方格的数字。现在要求你走过的方格的所有数之和最大,问这个最大和是多少。
[输入] 输入数据第一行为两个正整数N、K(1<=N<=100,0<=K<=N)接下来的n行,每行有n个不超过integer范围的整数,表示地图中的数。
[输出] 输出数据只有一行,为最大的和。
[输入输出示例]
输入(maze.in) 3 1
2 5 3
6 2 4
7 9 2
输出(maze.out) 31
[评分标准] 对于每个测试数据,如果你能够得出正确的答案,那么你将得到满分,否则得0分。 ===========================================================================================================
Var
i,j,k,m,n:longint;
ans:longint;
now:longint;
f,a:array[0..101,0..101] of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end;
function bfs(x,y:longint):longint;
var i,j,k:longint;
begin
if f[x,y]<>-1 then exit(f[x,y]);
bfs:=a[x,y];\\bfs要注意初始化,若当前各不能向任何方向扩展,则到达当前格的最优值是这一格的值
for i:=0 to m do\\i枚举上下左右各最多能扩展几格(m格)
begin
if (x-i>0) and (a[x-i,y]>a[x,y]) then\\注意大于小于号由小到大所以目的格要大于当前格 bfs:=max(bfs,bfs(x-i,y)+a[x,y]);
if (x+i<n+1) and (a[x+i,y]>a[x,y]) then bfs:=max(bfs,bfs(x+i,y)+a[x,y]);
if (y-i>0) and (a[x,y-i]>a[x,y]) then bfs:=max(bfs,bfs(x,y-i)+a[x,y]);
if (y+i<n+1) and (a[x,y+i]>a[x,y]) then bfs:=max(bfs,bfs(x,y+i)+a[x,y]);
end;
f[x, y]:=bfs;\\记忆化
end;
begin
assign(input,'maze.in');
assign(output,'maze.out');
reset(input);
rewrite(output);
readln(n,m);
for i:=1 to n do
for j:=1 to n do
f[i,j]:=-1;
for i:=0 to n+1 do
begin f[i,0]:=0; f[i,n+1]:=0; f[0,i]:=0; f[n+1,i]:=0; end;
ans:=0;
for i:=1 to n do
begin
for j:=1 to n do
read(a[i,j]);
readln;
end;
ans:=bfs(1,1);\\审题,是从第一个格子向外扩展
writeln(ans);
close(input);
close(output);
end.
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号