[USACO]Overfencing
有两个关键点:
将整个平面图看作一个图,然后再将栏杆标记为不能走就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天