egypt

来源:互联网 发布:淘宝电脑版详情页尺寸 编辑:程序博客网 时间:2024/06/04 19:18

题目描述

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

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

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

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

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

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

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

注意:

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

 

 

    如图所示,一座大小为3的金字塔的俯视图就是这个样子的。从A211)、B212)、C221)、D222)都可以走到E311)。其他位置依次类推。

 



输入

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

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

接下来的m行,每行7个整数ai1bi1ci1ai2bi2ci2pi。表示ai1层的第bi1行第ci1ai2层的第bi2行第ci2之间有一条时间为pi的暗道。保证ai1<ai2

输出

一个整数,即泽泽走到金字塔顶端的最短时间。

样例输入

4 24 1 5 24 3 4 71 9 2 80 3 5 12 8 59 3 91 1 87 45 2421 1 2 2 3 1 11 3 2 2 2 1 7

样例输出

52

数据范围限制

提示

【样例说明】

流程:

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

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

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

4         231走到232,总时间为7+1=8

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

6         再上楼到了411,总时间为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
原创粉丝点击