sicily 1215 脫離地牢

2021-07-06 01:37:24 字數 2901 閱讀 9169

time limit: 1 secs, memory limit: 32 mb

在乙個神秘的國度裡,年輕的王子paris與美麗的公主helen在一起過著幸福的生活。他們都隨身帶有一塊帶磁性的陰陽魔法石,身居地獄的魔王satan早就想得到這兩塊石頭了,只要把它們熔化,satan就能吸收其精華大增自己的魔力。於是有一天他趁二人不留意,把他們帶到了自己的地牢,分別困在了不同的地方。然後satan念起了咒語,準備煉獄,界時二人都將葬身於這地牢裡。

危險!paris與helen都知道了satan的意圖,他們要怎樣才能打敗魔王,脫離地牢呢?paris想起了父王臨終前留給他的備忘本,原來他早已料到了satan的野心,他告訴paris只要把兩塊魔法石合在一起,唸出咒語,它們便會放出無限的光亮,殺死魔王,脫離地牢,而且本子上還附下了地牢的地圖,paris從中了解到了helen的位置所在。於是他決定首先要找到helen,但是他發現這個地牢很奇怪,它會增強二人魔法石所帶磁力的大小,而且會改變磁力的方向。這就是說,每當pairs向南走一步,helen有可能會被石頭吸引向北走一步。而這個地獄布滿了岩石與熔漿,pairs必須十分小心,不僅他不能走到岩石或熔漿上,而且由於他行走一步,helen的位置也會改變,如果helen碰到岩石上,那麼她將停留在原地,但如果helen移動到了熔漿上,那麼她將死去,paris就找不到她了。

pairs仔細分析了地圖,他找出了一條最快的行走方案,最終與helen相聚。他們一起唸出了咒語"@^&#……%@%&$",轟隆一聲,地牢塌陷了,他們又重見光明……

輸入資料第一行為兩個整數n,m(3<=n,m<=20),表示地牢的大小,n行m列。接下來n行,每行m個字元,描述了地牢的地圖,"."代表通路,"#"代表岩石,"!"代表熔漿。輸入保證地牢是封閉的,即四周均是均是岩石或熔漿。接下來一行有四個字元"n"(北),"s"(南),"w"(西),"e"(東)的排列,表示paris分別向nswe四個方向走時helen受磁石磁力影響的移動方向。

輸出檔案只有一行,如果paris能找到helen,輸出一整數d,為paris最少需要行走的步數;如果paris在255步之後仍找不到helen,則輸出"impossible"。注意相遇是指paris與helen最終到達同乙個格仔,或者二人在相鄰兩格移動後碰在了一起,而後者的步數算他們移動後的步數。

5 5

#####

#h..#

#.!.#

#.#p#

#####

wnse

5

解釋:paris行走方案為nnwws,每步過後helen位置在(2,2), (2,2), (3,2), (4,2), (3,2)。

題目分析

大意看題,注意限制條件

一,paris不能走到岩石或岩漿

二,helen不能走到岩漿上,走到岩石上要退回來

三,地牢是封閉的,這樣兩人永遠不會走到邊界上,所以在獲得位置時不必判斷是否在範圍內

四,相遇條件是走到同乙個格仔或者兩人互換位置

五,注意paris走的是nswe方向,注意相應座標的改變

六,在獲得地圖後,注意將兩人原來的位置標記為通路

七,接下來就是廣搜的問題了,標記走過的位置直接開了個四維陣列

最無語的是,以為只有乙個用例,呵呵

#include #include #include #include struct state 

};int main()

else if (palace[i][j] == 'h') }}

int dir_p[4][2] = ;

int dir_h[4][2];

std::cin >> str;

for (int i = 0; i < 4; ++i)

else if (c == 's')

else if (c == 'w')

else

}bool visited[row][col][row][col];

memset(visited, 0, sizeof(visited));

int ans = 0;

bool doit = false;

std::queueq;

q.push(state(r_p, c_p, r_h, c_h, 0));

visited[r_p][c_p][r_h][c_h] = 1;

while (!doit && !q.empty() && !ans)

r_h = nowstate.hr + dir_h[i][0];

c_h = nowstate.hc + dir_h[i][1];

if (palace[r_h][c_h] == '#') else if (palace[r_h][c_h] == '!')

//std::cout << r_p << "--" << c_p << " " << r_h << "--" << c_h << " " << 1+nowstate.steps << " " << i << std::endl;

if (r_p == r_h && c_p == c_h) else if (r_h == nowstate.pr && c_h == nowstate.pc &&

r_p == nowstate.hr && c_p == nowstate.hc)

state nextstate = state(r_p, c_p, r_h, c_h, nowstate.steps+1);

if (nowstate.steps+1 == 256)

if (!visited[nextstate.pr][nextstate.pc][nextstate.hr][nextstate.hc]) }}

if (doit && ans < 256)

printf("%d\n", ans);

else

printf("impossible\n");

}}

sicily 1215 脫離地牢

做sicily 1215脫離地牢 這一題,一直restrict function,都快崩潰了。最後發現是記憶體洩露,就是new出來的東西沒有及時delete導致的。具體是在廣度優先搜尋的時候,每找一次鄰居就new出一些節點,有些節點已被visited了然後我直接忽略它們,實際上是得把它們delete...

Sicily 1215 脫離地牢(BFS)

這道題按照題意直接bfs即可,主要要注意題意中的相遇是指兩種情況 一種是同時到達同一格仔,另一種是在移動時相遇,如paris在 1,2 而helen在 1,2 若下一步paris到達 1,1 而helen達到 1,2 這種情況也算是相遇。遇到熔漿 4546 if visit paris x pari...

1215 脫離地牢

此題有個巨大的吐槽的地方就是最終狀態的判定有兩種情況,相遇或者到乙個格仔裡,不要忘記當隊列為空要判定狀態為結束。還有可以用方向來代表陣列的下標,是 更具有可讀性。include include include using namespace std intconst maxn 50 char map...