*:極其簡單;
**:無需動筆;
***:需要深究細論;
****:要看題解;
*****:多次看題解,並多次問人;
******:需要加以**分析;
題目:
這道題,因為資料只存在一條路徑,所以可以按照原圖去模擬,注意一點:
乙個管道如果是『+』號,則四周不可能有'.'
乙個管道如果是『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口油井...