egypt

题目描述
泽泽已 52:0 的比分输了球,被足球流氓打了一顿,扔进了窨井里……

出来的时候,泽泽已经在埃及了。

滚滚的黄沙在周围飞舞,没有一样生物在这里栖息。泽泽不想就挂在这里。忽然,泽泽被风沙遮住的眼睛瞥见了一座金字塔。这是一座很雄伟的金字塔,而且重要的是,金字塔顶端,竟然有一架直升飞机!

泽泽就像抓到了救命稻草,用他在长城上 999999999999999999 mod 2 倍的速度疯狂向金字塔奔跑。来到金字塔下,风把他刮进了金字塔。

门“轰隆隆”地关上了。泽泽看见里面陈列着很多珍品,但依然存在着暗器。但是还好,有个盗墓的把木乃伊给挖走了,所以在金字塔里没有跳动的僵尸。泽泽需要做的就是尽快跑向金字塔的顶端。

现在泽泽在金字塔最底层的左上角。他可以向前后左右或走到楼上去,但必须花费一点时间。一旦走到楼上后楼下的门就会关闭,泽泽不能回下去了,因此泽泽格外小心。幸运的是,金字塔很巧妙。在金字塔里有一些暗道,可以从某点直接通向某点,而不用再走最平常的路线,也是只能上不能下。泽泽知道这些暗道在哪里,而且知道走到每个地方的所花费的时间。

现在你要做的就是算出泽泽走到金字塔顶端所花最少的时间。

注意:

n 层第 i 行第 j 列我们表示成 n i j 。当 n>=2 时, n i j 可以由 4 个位置走来(不包括暗道)。如 3 1 1 可以从 2 1 1 2 1 2 2 2 1 2 2 2 走来。

 

 

     如图所示,一座大小为 3 的金字塔的俯视图就是这个样子的。从 A 2 1 1 )、 B 2 1 2 )、 C 2 2 1 )、 D 2 2 2 )都可以走到 E 3 1 1 )。其他位置依次类推。

 



输入
1 行为 2 个整数 n m n 表示金字塔的底部边长以及高, m 表示有多少暗道。

接下来有 n 张正方形的图,每张图用一个回车隔开,表示从最底层到最高层的每个位置所花费的时间。保证上面的图的边长比下面图的多 1 。(如样例,这座大小为 4 的金字塔第 1 层是 4*4 的,第 2 层是 3*3 ,第 3 层是 2*2 ,第 4 层是 1*1 。)

接下来的 m 行,每行 7 个整数 ai1 bi1 ci1 ai2 bi2 ci2 pi 。表示 ai1 层的第 bi1 行第 ci1 ai2 层的第 bi2 行第 ci2 之间有一条时间为 pi 的暗道。保证 ai1<ai2
输出
一个整数,即泽泽走到金字塔顶端的最短时间。
样例输入
4 2



4 1 5 2

4 3 4 7

1 9 2 8

0 3 5 1



2 8 5

9 3 9

1 1 8



7 4

5 2



42



1 1 2 2 3 1 1

1 3 2 2 2 1 7

样例输出
52

数据范围限制
提示
【样例说明】

流程:

1          泽泽一开始在 1 1 1 的位置,总时间为 0+4=4

2          1 1 1 走到 1 1 2 ,总时间为 4+1=5

3          走暗道到了 2 3 1 ,总时间为 5+1+1=7

4          2 3 1 走到 2 3 2 ,总时间为 7+1=8

5          再上楼到了 3 2 2 ,总时间为 8+2=10

6          再上楼到了 4 1 1 ,总时间为 10+42=52

【限制】

对于 50% 的数据, n<=5

对于100%的数据,n<=100m<=50,每格的暗道总数不超过10个。

uses math;
var
        a,b,c,d,e,i,j,k,k1,a1,b1,c1,a2,b2,c2,d1:longint;
        v:array[1..100,1..100,1..100]of longint;
        f:array[0..100,0..100,0..100]of longint;
        r1:array[1..50,1..7]of longint;
        bz:boolean;
begin
        assign(input,'egypt.in');reset(input);
        assign(output,'egypt.out');rewrite(output);
        readln(a,b);
        for c:=1 to a do
        begin
                for d:=1 to a-c+1 do
                begin
                        for e:=1 to a-c+1 do
                        begin
                                read(v[c,d,e]);
                        end;
                        readln;
                end;
                readln;
        end;
        for c:=1 to b do
                readln(r1[c,1],r1[c,2],r1[c,3],r1[c,4],r1[c,5],r1[c,6],r1[c,7]);
        fillchar(f,sizeof(f),127);
        f[1,1,1]:=v[1,1,1];
        bz:=true;
        while bz=true do
        begin
                bz:=false;
                for i:=1 to a do
                begin
                        for j:=1 to a-i+1 do
                        begin
                                for k:=1 to a-i+1 do
                                begin
                                        k1:=f[i,j,k];
                                        f[i,j,k]:=min(f[i,j,k],f[i,j+1,k]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i,j-1,k]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i,j,k+1]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i,j,k-1]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i-1,j,k]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i-1,j+1,k]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i-1,j,k+1]+v[i,j,k]);
                                        f[i,j,k]:=min(f[i,j,k],f[i-1,j+1,k+1]+v[i,j,k]);
                                        if f[i,j,k]<>k1 then bz:=true;
                                end;
                        end;
                end;
                for c:=1 to b do
                begin
                        f[r1[c,4],r1[c,5],r1[c,6]]:=min(f[r1[c,1],r1[c,2],r1[c,3]]+r1[c,7]+v[r1[c,4],r1[c,5],r1[c,6]],f[r1[c,4],r1[c,5],r1[c,6]]);
                end;
        end;
        writeln(f[a,1,1]);
        close(input);
        close(output);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值