P1519 穿越柵欄 Overfencing
阿新 • • 發佈:2018-12-17
usaco裡的搜尋其實還是不錯的,這自然也不是一道水題(其實是我題目看錯了)
這類題目一般都是一題多解,既然如此垃圾的我自然用bfs
const z:array[1..4,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1)); var i,j,k:longint; a,b:array[0..1000,0..1000]of boolean; p:array[0..1000,0..1000]of longint; x,y,u:array[0..1010101]of longint; m,n,x1,y1,x2,y2,h,t,max:longint; ch:char; procedure bfs(x1,y1:longint);//一個裸的bfs var h,t,i,j,k:longint; begin h:=1; t:=1; x[1]:=x1; y[1]:=y1; b:=a; u[1]:=0; while h>=t do begin for i:=1 to 4 do if b[x[t]+z[i,1],y[t]+z[i,2]] then begin inc(h); b[x[t]+z[i,1],y[t]+z[i,2]]:=false; x[h]:=x[t]+z[i,1]; y[h]:=y[t]+z[i,2]; u[h]:=u[t]+1; if u[h]<p[x[h],y[h]] then p[x[h],y[h]]:=u[h];//記錄最優解,因為有兩個出口 end; inc(t); end; end; begin read(n,m); readln;//讀入麻煩一點 for i:=1 to m*2+1 do begin for j:=1 to n*2+1 do begin read(ch); if ch=' ' then begin a[i,j]:=true; end else begin a[i,j]:=false; end; if (i=1) or (i=m*2+1) or (j=1) or (j=n*2+1) then//在邊上 if ch=' ' then begin if (x1=0) and (y1=0) then begin x1:=i; y1:=j; end else begin x2:=i; y2:=j; end; end; end; readln; end; p[x1,y1]:=1; p[x2,y2]:=1; for i:=1 to m*2+1 do for j:=1 to n*2+1 do begin p[i,j]:=maxlongint;//初值 end; //兩個出口 bfs(x1,y1); bfs(x2,y2); for i:=2 to m*2 do for j:=2 to n*2 do if (p[i,j]>max) and (p[i,j]<>maxlongint) and (i mod 2=0) and (j mod 2=0) then {找最大值}max:=p[i,j]; write(max div 2+1);//因為記錄的是格數不是字元數 end.
最後才發現這題難度其實是在讀入和處理。還是蠻水的