高中OJ1432 輸油管道

2021-07-24 21:51:43 字數 4280 閱讀 1940

*:極其簡單;

**:無需動筆;

***:需要深究細論;

****:要看題解;

*****:多次看題解,並多次問人;

******:需要加以**分析;

題目:

這道題,因為資料只存在一條路徑,所以可以按照原圖去模擬,注意一點:

乙個管道如果是『+』號,則四周不可能有'.'

乙個管道如果是『1』,則不可能右邊或下面缺乙個與之相連的管道…………

總之,意思就是乙個管道的四周不能有缺口。

那麼,我們按照圖一直去模擬,找到乙個缺口時直接判斷這個缺口四周管道的特性,理性分析得出答案。

**:

const

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

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

var ans:array[1..4] of boolean;

bz:array[1..25,1..25] of boolean;

b:array['+'..'|',1..4] of boolean;

d:array[1..10000,1..2] of longint;

ch:array[1..25,1..25] of char;

n,m,i,j,x,y,head,tail,xx,yy,***,yyy:longint;

begin

readln(n,m);

for i:=1 to n do

begin

for j:=1 to m do

begin

read(ch[i,j]);

if ch[i,j]='m' then

begin

x:=i;

y:=j;

end;

end;

readln;

end;

fillchar(bz,sizeof(bz),true);

bz[x,y]:=false;

b['|',1]:=true; b['|',4]:=true; b['-',2]:=true; b['-',3]:=true; b['+',1]:=true; b['+',2]:=true; b['+',3]:=true; b['+',4]:=true;

b['1',3]:=true; b['1',4]:=true; b['2',1]:=true; b['2',3]:=true; b['3',1]:=true; b['3',2]:=true; b['4',2]:=true; b['4',4]:=true;

head:=0;

tail:=1;

d[1,1]:=x;

d[1,2]:=y;

for i:=1 to 4 do

begin

xx:=x+dx[i]; yy:=y+dy[i];

if (xx=0) or (xx>n) or (yy=0) or (yy>m) then continue;

if ch[xx,yy]<>'.' then b['m',i]:=true;

end;

while headn) or (yy=0) or (yy>m) then continue;

if ch[xx,yy]='.' then

begin

write(xx,' ',yy,' ');

for j:=1 to 4 do

begin

***:=xx+dx[j]; yyy:=yy+dy[j];

if (***=0) or (***>n) or (yyy=0) or (yyy>m) then continue;

if (ch[***,yyy]<>'.') and b[ch[***,yyy],5-j] then ans[j]:=true;

end;

if ans[1] and ans[2] and ans[3] and ans[4] then writeln('+') else

if ans[1] and ans[4] then writeln('|') else

if ans[2] and ans[3] then writeln('-') else

if ans[3] and ans[4] then writeln('1') else

if ans[1] and ans[3] then writeln('2') else

if ans[1] and ans[2] then writeln('3') else

if ans[2] and ans[4] then writeln('4');

halt;

endelse

begin

if bz[xx,yy] and (b[ch[xx,yy],5-i]) then

begin

bz[xx,yy]:=false;

inc(tail);

d[tail,1]:=xx;

d[tail,2]:=yy;

end;

end;

end;

end;

end.

但是這樣模擬的話顯然程式設計複雜度是較高的,這個**裡也已經寫的很精簡了,但還是免不了4000+

我們可以考慮一種新的思路,是否不模擬,直接找出缺口?

理性分析一下,應該是有規律的;

根據上面分析的管道周圍不可能有缺口,我們可以如下討論:對於乙個『.』,我們假設它的管道是什麼,然後依次理性判斷周圍的管道就可以了。

**:

var

ch:array[0..25,0..25] of char;

n,m,i,j:longint;

a,b,c,d:char;

begin

readln(n,m);

for i:=1 to n do

begin

for j:=1 to m do

begin

read(ch[i,j]);

end;

readln;

end;

for i:=1 to n do

for j:=1 to m do

begin

if ch[i,j]<>'.' then continue;

a:=ch[i-1,j]; b:=ch[i,j-1]; c:=ch[i,j+1]; d:=ch[i+1,j];

if ((a='|') or (a='+') or (a='1') or (a='4')) and ((b='-') or (b='+') or (b='1') or (b='2')) and ((c='-') or (c='+') or (c='3') or (c='4')) and ((d='|') or (d='+') or (d='2') or (d='3')) then writeln(i,' ',j,' ','+') else

if ((a='+') or (a='|') or (a='4') or (a='1')) and ((d='+') or (d='|') or (d='2') or (d='3')) then writeln(i,' ',j,' ','|') else

if ((b='+') or (b='1') or (b='2') or (b='-')) and ((c='+') or (c='3') or (c='4') or (c='-')) then writeln(i,' ',j,' ','-') else

if ((c='-') or (c='+') or (c='3') or (c='4')) and ((d='|') or (d='+') or (d='2') or (d='3')) then writeln(i,' ',j,' ','1') else

if ((a='+') or (a='|') or (a='1') or (a='4')) and ((c='-') or (c='3') or (c='+') or (c='4')) then writeln(i,' ',j,' ','2') else

if ((a='+') or (a='|') or (a='1') or (a='4')) and ((b='-') or (b='2') or (b='1') or (b='+')) then writeln(i,' ',j,' ','3') else

if ((b='-') or (b='+') or (b='1') or (b='2')) and ((d='|') or (d='+') or (d='2') or (d='3')) then writeln(i,' ',j,' ','4');

end;

end.

雖然if太多,不過這道有點碼農的題目,也要有耐心啊!

本題難度:***

輸油管道 Standard IO

請你幫忙設計乙個從城市m到城市z的輸油管道,現在已經把整個區域劃分為r行c列,每個單元格可能是空的也可能是以下7種基本管道之一 油從城市m流向z,型管道比較特殊,因為石油必須在兩個方向 垂直和水平 上傳輸,如下圖所示 現在 弄到了輸油管道的設計圖,並把其中乙個單元格中的管道偷走了,請你幫忙找到偷走的...

輸油管道問題

某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n 口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n 口油井的位置,即它們的x 座標 東西向 和y 座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?1 ...

輸油管道問題

某石油公司計畫建造一條由東向西的主輸油管道。該管道要穿過乙個有n口油井的油田。從每口油井都要有一條輸油管道沿最短路經 或南或北 與主管道相連。如果給定n口油井的位置,即它們的x座標 東西向 和y座標 南北向 應如何確定主管道的最優位置,即使各油井到主管道之間的輸油管道長度總和最小的位置?給定n口油井...