p2439.dpr

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· DPR 代码 · 共 118 行

DPR
118
字号
program p2439;

{$APPTYPE CONSOLE}

type
        triple  = array[1..4] of Integer;
        Typeans = record
                total           : Integer;
                solve           : array[1..1200] of triple;
                end;
        Tans    = ^Typeans;
        TypeC_L = array[1..4] of Integer;

var
        part , tx , ty , K      : Integer;
        p , q                   : Tans;
        min                     : Integer;
        c , l , choose          : TypeC_L;

PROCEDURE Init;
var
        ta , tb , tc , td , i   : Integer;
begin
read ( ta , tb , tc , td , K );
tx := abs ( tc - ta );
ty := abs ( td - tb );
for i := 1 to K do read ( l [i] );
for i := 1 to K do read ( c[i] );
end;

PROCEDURE Make ( var d : Tans; final : Integer);
var
        i , j , sum , dep     : Integer;
begin
new ( d );
d ^. total := 0;
sum := 0;
dep := 0;
choose [1] := - c [1] - 1;
while ( true ) do
        begin
        inc ( dep ) ;

        if dep = K then
                begin
                sum := 0;
                for i := 1 to K - 1 do sum := sum + l [i] * choose [i];
                if abs ( final - sum ) mod l [k] = 0 then
                        begin
                        j := ( final - sum ) div l [K];
                        if abs ( j ) <= c [K] then
                                begin
                                inc ( d ^.total );
                                for i := 1 to K - 1 do
                                        d ^.solve [d^.total] [i] := choose [i];
                                d ^.solve [d^.total] [K] := j;
                                end;
                        end;
                dec ( dep );
                end;

        while ( dep > 0 ) and ( choose [dep] = c [dep] ) do
                begin
                choose [dep] := - c [dep] - 1;
                dec ( dep );
                end;
        if dep = 0 then break;
        inc ( choose [dep] );
        end;
end;

PROCEDURE Main;
var
        i , j , a , sum         : Integer;
        well                    : Boolean;
begin
Make ( p , tx );

//writeln ( p ^.total);
//for i := 1 to K do write ( p ^.solve [1] [i] ,'  ' );
//writeln;

if ty = tx then q := p
        else Make ( q , ty );

min := maxint;
for i := 1 to p ^.total do
        for j := 1 to q ^.total do
                begin
                sum  := 0;
                well := true;
                for a := 1 to K do
                        if abs ( p ^.solve [i] [a] ) + abs ( q ^.solve [j] [a] ) > c [a] then
                                begin
                                well := false;
                                break;
                                end else sum := sum + abs ( p ^.solve [i] [a] ) + abs ( q ^.solve [j] [a] );
                if well and ( sum < min ) then min := sum; 
                end;
if min < maxint then writeln ( min )
        else writeln ( -1 );
end;

begin
//assign ( input , 'p.in' );
//reset ( input );
//assign ( output , 'p.out' );
//rewrite ( output );
read ( part ) ;
while ( part > 0 ) do
        begin
        dec ( part );
        Init;
        Main;
        if part > 0 then writeln;
        end;
end.

⌨️ 快捷键说明

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