Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

普通宽搜+special

Posted by The_Dawn at 2011-05-06 17:26:17 on Problem 2384
type
  rec=record
    px,py,bx,by,step:longint;
  end;

const
  d:array[1..4,1..2]of longint=((-1,0),(0,1),(1,0),(0,-1));

var
  n,i,j,k,stx,sty,ans,l,r:longint;
  map:array[0..26,0..26]of char;
  v:array[1..25,1..25,1..25,1..25]of longint;
  q:array[1..1000000]of rec;

procedure findst;
  begin
    if map[i,j]='*' then
      begin
        stx:=i;sty:=j;
      end;
  end;

procedure init_renew;
  var
    ch:char;
  begin
    fillchar(v,sizeof(v),255);
    readln(n);
    for i:=0 to n+1 do
      for j:=0 to n+1 do map[i,j]:='#';
    for i:=1 to n do
      begin
        for j:=1 to n do begin read(map[i,j]);findst;end;
        readln;
      end;
  end;

procedure bfs;
  var
    nx,ny:longint;
  begin
    l:=1;
    for i:=1 to 4 do
      begin
        nx:=stx+d[i,1];ny:=sty+d[i,2];
        if map[nx,ny]='.' then
          begin
            inc(r);
            with q[r] do
              begin
                px:=nx;py:=ny;
                bx:=stx;by:=sty;
              end;
            v[nx,ny,stx,sty]:=0;
          end;
      end;

    while l<=r do
      begin
        for i:=1 to 4 do
          begin
            nx:=q[l].px+d[i,1];
            ny:=q[l].py+d[i,2];
            if (map[nx,ny]<>'#')and((nx<>q[l].bx)or(ny<>q[l].by))
            and(v[nx,ny,q[l].bx,q[l].by]=-1) then
              begin
                inc(r);
                with q[r] do
                  begin
                    px:=nx;py:=ny;
                    bx:=q[l].bx;by:=q[l].by;
                    step:=q[l].step+1;
                    v[px,py,bx,by]:=step;
                  end;
                if q[r].step>ans then ans:=q[r].step;
              end;
          end;

        for i:=1 to 4 do with q[l] do
          begin
            if (px+d[i,1]=bx)and(py+d[i,2]=by)and
            (map[px-d[i,1],py-d[i,2]]<>'#')and
            (v[px-d[i,1],py-d[i,2],px,py]=-1) then
              begin
                inc(r);
                with q[r] do
                  begin
                    px:=q[l].px-d[i,1];
                    py:=q[l].py-d[i,2];
                    bx:=q[l].px;
                    by:=q[l].py;
                    step:=q[l].step+1;
                    v[px,py,bx,by]:=step;
                  end;
                if q[r].step>ans then ans:=q[r].step;
              end;
          end;
        inc(l);
      end;
  end;

function max(a,b:longint):longint;
  begin
    if a>b then exit(a) else exit(b);
  end;

procedure special;
  var
    i,j,k,l:longint;
  begin
    ans:=0;
    for i:=1 to n do
      for j:=1 to n do
        for k:=1 to n do
          for l:=1 to n do
            begin
              if (k=stx)and(l=sty) then v[i,j,k,l]:=0;
              ans:=max(ans,v[i,j,k,l]);
            end;
  end;

begin
  init_renew;
  bfs;
  special;
  writeln(ans);
end.


special过程的用处是,判断宽搜到得某个状态,是否就是箱子在终点的状态。如果是,那么这个搜到的状态值就应该是0。

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator