| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
8个月之后居然还记得 楼主威武In Reply To:Re:谁能发份标程? Posted by:linusc at 2010-12-18 16:46:08 > 200ms
>
> {$inline on}
>
> const
>
> qsize=1 shl 18;
>
> di:array [0..4,0..1] of integer=((0,0),(1,0),(-1,0),(0,-1),(0,1));
>
> type
>
> bty=array [1..3,0..1] of word;
>
> bta=dword;
>
> var
>
> map:array [1..16,1..16] of char;
>
> dt:array [0..qsize] of bta;
>
> dis:array [0..16777215] of integer;
>
> i,j,w,h,n,basval:integer;
>
> a,b,fr,ti:bty;
>
> ans:integer;
>
> f,r:longint;
>
> procedure encode(var x:dword);
>
> begin
>
> x:=0;
>
> x:=(b[1][0]-1)or((b[1][1]-1) shl 4);
>
> x:=x or ((b[2][0]-1)or((b[2][1]-1) shl 4)) shl 8;
>
> x:=x or ((b[3][0]-1)or((b[3][1]-1) shl 4)) shl 16;
>
> end;
>
> procedure decode(x:dword);
>
> begin
>
> a[1][0]:=x and $f+1;
>
> a[1][1]:=(x and $f0) shr 4+1;
>
> a[2][0]:=(x and $f00) shr 8+1;
>
> a[2][1]:=(x and $f000) shr 12+1;
>
> a[3][0]:=(x and $f0000) shr 16+1;
>
> a[3][1]:=(x and $f00000) shr 20+1;
>
> end;
>
> function valid(i:integer):boolean;inline;
>
> begin
>
> valid:=(b[i][0]>0)and(b[i][0]<=h)
>
> and(b[i][1]>0)and(b[i][1]<=w)
>
> and(map[b[i][0]][b[i][1]]<>'#');
>
> end;
>
> function same(i,j:integer):boolean;inline;
>
> begin
>
> same:=(b[i][0]=b[j][0])and(b[i][1]=b[j][1]);
>
> end;
>
> function exchanged(i,j:integer):boolean;inline;
>
> begin
>
> exchanged:=(a[i][0]=b[j][0])and(a[i][1]=b[j][1])
>
> and(a[j][0]=b[i][0])and(a[j][1]=b[i][1]);
>
> end;
>
> procedure push(x:bta;d:integer);
>
> begin
>
> dt[r]:=x;
>
> r:=(r+1)and(qsize-1);
>
> dis[x]:=d;
>
> end;
>
> function bfs:integer;
>
> var
>
> i1,i2,i3,e1,e2,e3:integer;
>
> x,y:bta;
>
> begin
>
> f:=1;r:=1;
>
> b:=fr;encode(x);
>
> push(x,basval+1);
>
> b:=ti;encode(x);
>
> push(x,-basval-1);
>
> e1:=4;e2:=4;e3:=4;
>
> if n<3 then e3:=0;
>
> if n<2 then e2:=0;
>
> while (f<>r) do
>
> begin
>
> x:=dt[f];f:=(f+1)and(qsize-1);
>
> decode(x);
>
> if dis[x]>0 then begin
>
> for i1:=0 to e1 do
>
> begin
>
> b[1][0]:=a[1][0]+di[i1][0];
>
> b[1][1]:=a[1][1]+di[i1][1];
>
> if not valid(1) then continue;
>
> for i2:=0 to e2 do
>
> begin
>
> b[2][0]:=a[2][0]+di[i2][0];
>
> b[2][1]:=a[2][1]+di[i2][1];
>
> if (n>1) and (not valid(2) or same(1,2) or exchanged(1,2)) then continue;
>
> for i3:=0 to e3 do
>
> begin
>
> b[3][0]:=a[3][0]+di[i3][0];
>
> b[3][1]:=a[3][1]+di[i3][1];
>
> if (n>2) and (not valid(3) or same(1,3) or exchanged(1,3) or same(2,3) or exchanged(2,3)) then continue;
>
> encode(y);
>
> if dis[y]>basval then continue;
>
> if dis[y]<-basval then begin
>
> bfs:=(dis[x]-dis[y]-1-2*basval);
>
> inc(basval,1000);
>
> exit;
>
> end
>
> else
>
> push(y,dis[x]+1);
>
> end;
>
> end;
>
> end;
>
> end
>
> else begin
>
> for i1:=0 to e1 do
>
> begin
>
> b[1][0]:=a[1][0]+di[i1][0];
>
> b[1][1]:=a[1][1]+di[i1][1];
>
> if not valid(1) then continue;
>
> for i2:=0 to e2 do
>
> begin
>
> b[2][0]:=a[2][0]+di[i2][0];
>
> b[2][1]:=a[2][1]+di[i2][1];
>
> if (n>1) and (not valid(2) or same(1,2) or exchanged(1,2)) then continue;
>
> for i3:=0 to e3 do
>
> begin
>
> b[3][0]:=a[3][0]+di[i3][0];
>
> b[3][1]:=a[3][1]+di[i3][1];
>
> if (n>2) and (not valid(3) or same(1,3) or exchanged(1,3) or same(2,3) or exchanged(2,3)) then continue;
>
> encode(y);
>
> if dis[y]<-basval then continue;
>
> if dis[y]>basval then begin
>
> bfs:=(dis[y]-dis[x]-1-2*basval);
>
> inc(basval,1000);
>
> exit;
>
> end
>
> else
>
> push(y,dis[x]-1);
>
> end;
>
> end;
>
> end;
>
> end;
>
> end;
>
> exit(-1);
>
> end;
>
> begin
>
> basval:=0;
>
> readln(w,h,n);
>
> while (w<>0)and(h<>0)and(n<>0) do
>
> begin
>
> for i:=1 to h do
>
> begin
>
> for j:=1 to w do
>
> begin
>
> read(map[i][j]);
>
> case map[i][j] of
>
> 'a':begin fr[1][0]:=i;fr[1][1]:=j; end;
>
> 'b':begin fr[2][0]:=i;fr[2][1]:=j; end;
>
> 'c':begin fr[3][0]:=i;fr[3][1]:=j; end;
>
> 'A':begin ti[1][0]:=i;ti[1][1]:=j; end;
>
> 'B':begin ti[2][0]:=i;ti[2][1]:=j; end;
>
> 'C':begin ti[3][0]:=i;ti[3][1]:=j; end;
>
> end;
>
> end;
>
> readln;
>
> end;
>
> for i:=n+1 to 3 do begin fr[i][0]:=1;fr[i][1]:=1;ti[i][0]:=1;ti[i][1]:=1; end;
>
> ans:=bfs;
>
> writeln(ans);
>
> readln(w,h,n);
>
> end;
>
> end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator