ZSC 1306 沼躍魚早已看穿了一切 題解

2021-06-28 09:17:54 字數 1513 閱讀 3999

題目鏈結 :

沼躍魚開啟密碼門後發現門後是乙個像迷宮一樣的房間,牆上的指示牌寫著:房間內某處有一寶箱,但是寶箱被上鎖了,鑰匙在這個房間的某個角落。沼澤魚對寶箱裡有什麼很感興趣,但它必須先去拿到鑰匙才可以開啟寶箱。然而沼躍魚早已看穿了一切,它看清了這個房間的布局,現在給出房間的布局圖,問沼躍魚拿到鑰匙並開啟寶箱最少需要走多少步。沼躍魚每次只能向上、下、左、右中其中乙個方向走一步,但若那個位置是牆時則不能往那個位置走(顯然,沼躍魚不能穿牆)。

輸入的第一行是乙個整數t(0

每組資料的第一行有兩個整數n,m(0

接下來n行,每行有m個字元,『s』表示開始時沼躍魚所處的位置,『#』代表牆,『*』代表空地,『k』代表鑰匙,『b』表示寶箱。鑰匙只有一把。

詳情參看樣例輸入。

對於每組資料,輸出一行包含乙個整數x,x代表沼躍魚拿到鑰匙並開啟寶箱所需的最少步數。若沼躍魚不能夠拿到鑰匙並開啟寶箱(即到達不了鑰匙或寶箱所在處)則輸出-1。

1 5 6

***#b#

s**#*#

##***#

k#*#*#

***#*#

17對於樣例資料,房間寬5個單位,長6個單位。

從s出發到k需要的最少步數為8,而從k出發到b所需的最少步數為9.

所以答案為8 + 9 = 17.

請使用scanf("%s", s);或cin>> s;來讀取字串以避免出現漏讀多讀的情況。

「美圖杯」第二屆新生賽,author:13凌嘉威

題解: 一道相對容易的bfs(廣度優先搜尋)的題目,找到 s, k, b 的位置後按 s -> k , k -> b 的方向bfs, 用 vis記錄每乙個可行的位置到起點的距離,就可以求出 s -> k -> b 的距離了, 要注意是否可到達這一條件。

#include #include #include #define inf 2147483647

const int max = 32;

const int cx = ;

const int cy = ;

char arr[max][max];

int vis[max][max];

struct point;

int bfs(point a, point b)}}

if (vis[b.x][b.y]) // 若可以到達,則返回到該點的距離

return vis[b.x][b.y];

return -inf; // 否則返回乙個不存在的值}

int main()

for (int i = 1; i <= n; i++) // 尋找起點,鑰匙位置,寶箱位置

else if (arr[i][j] == 'k')

else if (arr[i][j] == 'b')}}

if (((t1 = bfs(a, b)) != -inf) && ((t2 = bfs(b, c)) != -inf))

else

}return 0;

}

沼躍魚早已看穿了一切

沼躍魚開啟密碼門後發現門後是乙個像迷宮一樣的房間,牆上的指示牌寫著 房間內某處有一寶箱,但是寶箱被上鎖了,鑰匙在這個房間的某個角落。沼澤魚對寶箱裡有什麼很感興趣,但它必須先去拿到鑰匙才可以開啟寶箱。然而沼躍魚早已看穿了一切,它看清了這個房間的布局,現在給出房間的布局圖,問沼躍魚拿到鑰匙並開啟寶箱最少...

然而沼躍魚早就看穿了一切

時間限制 1000ms 單點時限 1000ms 記憶體限制 fjxmlhx每天都在被沼躍魚刷屏,因此他急切的找到了你希望你寫乙個程式遮蔽所有句子中的沼躍魚 marshtomp 不區分大小寫 為了使句子不缺少成分,統一換成 fjxmlhx 輸入包括多行。每行是乙個字串,長度不超過200。一行的末尾與下...

1082 然而沼躍魚早就看穿了一切

1082 然而沼躍魚早就看穿了一切 時間限制 1000ms 單點時限 1000ms 記憶體限制 256mb 描述 fjxmlhx每天都在被沼躍魚刷屏,因此他急切的找到了你希望你寫乙個程式遮蔽所有句子中的沼躍魚 marshtomp 不區分大小寫 為了使句子不缺少成分,統一換成 fjxmlhx 輸入 輸...