Đến nội dung

HackerCM1011

HackerCM1011

Đăng ký: 26-09-2017
Offline Đăng nhập: 26-09-2017 - 16:15
-----

Trong chủ đề: Giải bài toán quét vôi tối ưu bằng đệ quy

26-09-2017 - 16:16

t làm tới 9 phòng nhé. còn muốn làm n phòng thì sửa lại

 

 

const fi='test.inp'; fo='test.out';
var p:array[0..10000] of string;
    h:array[0..10000] of char;
    b,x,xbest:array[1..100] of byte;
    f:text;
    s:string;
    sv,svbest:longint;
 
 
    procedure doc;
    var i,j:longint;
        k:string;
    begin
        assign(f,fi); reset(f);
        fillchar(p,sizeof(p),0);
        for i:=1 to 9 do
        begin
            readln(f,p[i]);
        end;
        readln(f,s);
        for i:=1 to 9 do
        begin
                if s[i]='T' then b[i]:=0;
                if s[i]='X' then b[i]:=1;
                if s[i]='V' then b[i]:=2;
        end;
        close(f);
    end;
 
    procedure khoitao;
    begin
        svbest:=19;
        sv:=0;
    end;
 
 
 
 
    procedure inkq;
    var i,j:longint;
    begin
       // writeln(f,svbest);
        for i:=1 to 9 do
        for j:=1 to xbest[i] do write(f,i);
    end;
 
 
 
    procedure update;
    var i,sum:byte;
    begin
        sum:=0;
        for i:=1 to 9 do sum:=sum+ (b[i] mod 3);
        if (sum=0) and (sv<svbest) then
        begin
                svbest:=sv;
                xbest:=x;
        end;
    end;
 
 
 
 
    procedure try(i:byte);
    var spi,k,h,j:byte;
        st:string;
    begin
        if sv>svbest then exit;
        for j:=0 to 2 do
        begin
                x[i]:=j;
                st:=p[i];
                spi:=length(st);
                sv:=sv+spi*j;
                for k:=1 to j do
                        for h:=1 to spi do b[ord(st[h])-48]:=(b[ord(st[h])-48]+1);
                if i=9 then update
                else try(i+1);
                sv:=sv-spi*j;
                for k:=1 to j do
                        for h:=1 to spi do b[ord(st[h])-48]:=(b[ord(st[h])-48]-1);
        end;
    end;
 
begin
        doc;
        khoitao;
        try(1);
        assign(f,fo); rewrite(f);
        if svbest<19 then inkq
        else writeln(f,0);
        close(f);
end.