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