⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p1143.pas

📁 www.vijos.cn上一些习题的参考源码
💻 PAS
字号:
program ss;
const
    d:array[0..2] of byte=(0,1,0);
    MAXN=20;
var
    map:array[1..MAXN,1..MAXN] of word;
    f0,f1:array[1..MAXN,1..MAXN,1..MAXN] of word;
    val,x1,y1,x2,y2,x3,y3,xx1,yy1,xx2,yy2,xx3,yy3:word;
    n,x,y,i,d1,d2,d3:byte;
    t:word;
    
    function bound(x,y:byte):boolean;
    begin
        if ((x>=1)and(x<=n)) and ((y>=1)and(y<=n)) then
            bound:=true
        else
            bound:=false;
    end;
    
    function max(a,b:word):word;
    begin
        if a>=b then max:=a
        else max:=b;
    end;
    
begin
    readln(n);
    for x:=1 to n do begin
        for y:=1 to n do
            read(map[x,y]);
        readln;
    end;
    {readln(x,y,val);
    while (x<>0)or(y<>0)or(val<>0) do
    begin
        map[x,y]:=val;
        readln(x,y,val);
    end;}
    
    fillchar(f0,sizeof(f0),0);
    f0[1,1,1]:=map[1,1];
    for i:=2 to n+n-1 do begin
        fillchar(f1,sizeof(f1),0);
        for x1:=1 to i-1 do begin
            for x2:=1 to i-1 do begin
                for x3:=1 to i-1 do begin
                    y1:=i-x1; y2:=i-x2; y3:=i-x3;
                    if bound(x1,y1) and bound(x2,y2) and bound(x3,y3) then begin
                        for d1:=0 to 1 do begin
                            for d2:=0 to 1 do begin
                                for d3:=0 to 1 do begin
                                    {d1:(x1,y1)->(xx1,yy1);
                                    d2:(x2,y2)->(xx2,yy2);}
                                    xx1:=x1+d[d1]; yy1:=y1+d[d1+1];
                                    xx2:=x2+d[d2]; yy2:=y2+d[d2+1];
                                    xx3:=x3+d[d3]; yy3:=y3+d[d3+1];
                                    
                                    if(bound(xx1,yy1) and bound(xx2,yy2) and bound(xx3,yy3))
                                            {and (not((d1=d2) and (d2=d3)) or not((x1=x2) and (x2=x3)))} then begin
                                        if (xx1=xx2) and (xx2=xx3) then t:=f0[x1,x2,x3]+map[xx1,yy1]
                                        else if xx1=xx2 then t:=f0[x1,x2,x3]+map[xx1,yy1]+map[xx3,yy3]
                                        else if xx1=xx3 then t:=f0[x1,x2,x3]+map[xx1,yy1]+map[xx2,yy2]
                                        else if xx2=xx3 then t:=f0[x1,x2,x3]+map[xx1,yy1]+map[xx2,yy2]
                                        else t:=f0[x1,x2,x3]+map[xx1,yy1]+map[xx2,yy2]+map[xx3,yy3];

                                        if t>f1[xx1,xx2,xx3] then f1[xx1,xx2,xx3]:=t;
                                    end;
                                    {t1:=0; t2:=0;
                                    if (bound(xx1,yy1) and bound(xx2,yy2)) bound(xx3,yy3) and ((d1<>d2) or (xx1<>xx2)) then begin
                                        if xx1=xx2 then t1:=f0[x1,x2]+map[xx1,yy1]
                                        else t2:=f0[x1,x2]+map[xx1,yy1]+map[xx2,yy2];
                                        if max(t1,t2)>f1[xx1,xx2] then f1[xx1,xx2]:=max(t1,t2);
                                    end;}
                                end;
                            end;
                        end;
                    end;
                end;
            end;
        end;
        f0:=f1;
    end;
    writeln(f0[n,n,n]);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -