[USACO]Overfencing

Oct 30 2010

题目描述一个先:

有两个关键点:

将整个平面图看作一个图,然后再将栏杆标记为不能走就ok了

两次bfs来做flood fill?不用的,将两个起点直接放到队列里就可以了(不就是两次bfs么= =||),不过这样做可以减少很多代码量

代码

下面是令我傻了3天的地方:

procedure flood_fill;
var
        i:integer;
        temp:node;
begin
        while front<tail do
          begin
                  front:=front+1;
                  for i:=1 to 4 do
                    begin
                            temp:=queue[front];
                            inc(temp[1],d[i,1]);
                            inc(temp[2],d[i,2]);
                            if (fence[temp[1],temp[2]])and(not visited[temp[1],temp[2]]) then
                              begin
                                      inc(tail);
                                      queue[tail]:=temp;
                                      count[tail]:=count[front]+1;
                                      visited[temp[1],temp[2]]:=true;
                              end;
                    end;
          end;
end;
procedure flood_fill;
var
        i:integer;
        temp:node;
begin
        while front<=tail do
          begin
                  front:=front+1;
                  for i:=1 to 4 do
                    begin
                            temp:=queue[front];
                            inc(temp[1],d[i,1]);
                            inc(temp[2],d[i,2]);
                            if (fence[temp[1],temp[2]])and(not visited[temp[1],temp[2]]) then
                              begin
                                      inc(tail);
                                      queue[tail]:=temp;
                                      count[tail]:=count[front]+1;
                                      visited[temp[1],temp[2]]:=true;
                              end;
                    end;
          end;
end;

仔细观察这两个代码的不同点......

对了,就是跳出while的条件不同,因为我将front置为0,然后在每次提取队首时再inc(front),这样和置为1看似没什么不同,但是却出现了很大的问题:

后一段代码会爆掉的...

就因为这里调了我两天.orz,细节很重要!看来有必要去复习下模版了.

顺带鄙视下一些水人......现在真是越来越水了.

离复赛还有21天

Tags: ,

No responses yet

Leave a Reply