codevs 2059 逃出轉殖島(BFS)

2021-07-24 02:25:17 字數 2002 閱讀 1689

題目描述 description

oi小組的yh酷愛玩魔獸rpg,每天都會在u9搜尋最新的rpg地圖。

今天,他找到一張名為《逃出轉殖島》的地圖,在這張地圖中,有乙個n行m列的矩陣,矩陣由』y』,』c』,』#』,』*』,』p』,5種元素組成。

』y』表示yh的出生位置,c表示轉殖島的出口,』#』表示該處不可通過,』*』表示通過該處需要消耗金幣cost,』p』表示傳送陣,任意兩個傳送陣之間可以免費互相傳送。由於這僅僅是第一關,yh不想浪費太多的體力,聰明的你能幫他算出從』y』出發到』c』最少需要消耗多少金幣嗎?當然,如果yh永遠無法到達』c』,請輸出」 screw you!」以表到yh的不滿。

輸入描述 input description

第一行兩個整數,n,m,表示矩陣有n行m列

接下來為n行m列的矩陣,由』y』,』c』,』#』,』*』,』p』,組成,含義如題目描述。

輸出描述 output description

輸出1行,表示yh需要花費的最小體力(如果無法到達輸出」screw you!」)。

樣例輸入 sample input

【樣例輸入1】

1 3 3

y*c【樣例輸入2】

1 3 2

y#c【樣例輸入3】

1 5 2

yp#pc

樣例輸出 sample output

【樣例輸出1】

3【樣例輸出2】

screw you!

【樣例輸出3】

0資料範圍及提示 data size & hint

【資料範圍】

對於100%的資料,n*m≤5000,傳送陣』p』的數量≤500

題解:這題需要求y到c的最小花費,而且走一步的花費是一定的,所以很容易想到用bfs來做。因為你從任意乙個傳送門可以到達每乙個傳送門,所以多次進入傳送門是沒有意義的,所以我們遇到傳送門的時候就可以把地圖上的所有傳送門全部加入佇列。至於花費,我們只需要開乙個dis陣列記錄一下就好了。

**如下

#include

#include

#include

using

namespace

std;

int n,m,cost,sx,sy,ex,ey,tot=0;

int u[5]=;

int v[5]=;

int x[10010],y[10010],dis[10010];//dis陣列記錄花費

char

map[1010][1010];

bool used[1010][1010],chuan[1010][1010];//記錄傳送門座標

bool flag;

void bfs(int x1,int y1)

if(xx>0&&xx<=n&&yy>0&&yy<=m&&map[xx][yy]!='#'&&!used[xx][yy])

}ww++;

x[ww]=xx;

y[ww]=yy;

used[xx][yy]=1;

if(map[xx][yy]=='*') dis[ww]=dis[tt]+cost;

//如果走的是*讓dis陣列加上花費

else dis[ww]=dis[tt];//否則不加 }}

}}int main()

else

if(map[i][j]=='c')

else

if(map[i][j]=='p')

chuan[i][j]=1;

}bfs(sx,sy);

if(!flag) printf("screw you!\n");

return

0;}

2 05公尺的繩子

發現失火的時候,已經晚了。男人拉著女人衝向樓梯,卻被大火撲回。火勢迅速蔓延,整棟大樓像一塊瘋狂燃燒的炭,將每一寸空間烤成滾燙的烙鐵。儘管他們關緊房門,火舌和濃煙還是從門縫裡一絲一絲往裡擠。狹小的房間,逐漸變得熾熱難當。是午夜。某城的乙個賓館。男人和女人站在視窗呼救,拼命揮動手臂。他們看見消防隊員架起...

struts2 05 action萬用字元

實現動態訪問還可以通過萬用字元 eg success jsp 當訪問時 如果輸入 http localhost 8080 demo useradd 就會匹配到這個action。這時 就匹配為add 後面method的1的意思是第乙個星號,所以 也就是等於 method add 下面同理。即 succ...

205 接力賽跑

題目描述 n只奶牛 編號為1 n 在進行乙個特別的接力賽跑,這個比賽特別之處在於,若干只奶牛可以同時跑。在t 0時刻,牛1開始沿著跑道跑,l 1秒後跑完一圈重新到達起點線。通常,牛i跑完一圈需要的時間為l i秒。當牛1重新越過起點線的瞬間,它會通知另外m 1只奶牛立即起跑。通常,牛i會通知另外m i...