BFS Sicily 1215: 脱离地牢
1215.脫離地牢
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
在一個神秘的國度里,年輕的王子Paris與美麗的公主Helen在一起過著幸福的生活。他們都隨身帶有一塊帶磁性的陰陽魔法石,身居地獄的魔王Satan早就想得到這兩塊石頭了,只要把它們熔化,Satan就能吸收其精華大增自己的魔力。于是有一天他趁二人不留意,把他們帶到了自己的地牢,分別困在了不同的地方。然后Satan念起了咒語,準備煉獄,界時二人都將葬身于這地牢里。
危險!Paris與Helen都知道了Satan的意圖,他們要怎樣才能打敗魔王,脫離地牢呢?Paris想起了父王臨終前留給他的備忘本,原來他早已料到了Satan的野心,他告訴Paris只要把兩塊魔法石合在一起,念出咒語,它們便會放出無限的光亮,殺死魔王,脫離地牢,而且本子上還附下了地牢的地圖,Paris從中了解到了Helen的位置所在。于是他決定首先要找到Helen,但是他發現這個地牢很奇怪,它會增強二人魔法石所帶磁力的大小,而且會改變磁力的方向。這就是說,每當Pairs向南走一步,Helen有可能會被石頭吸引向北走一步。而這個地獄布滿了巖石與熔漿,Pairs必須十分小心,不僅他不能走到巖石或熔漿上,而且由于他行走一步,Helen的位置也會改變,如果Helen碰到巖石上,那么她將停留在原地,但如果Helen移動到了熔漿上,那么她將死去,Paris就找不到她了。
Pairs仔細分析了地圖,他找出了一條最快的行走方案,最終與Helen相聚。他們一起念出了咒語"@^&#……%@%&$",轟隆一聲,地牢塌陷了,他們又重見光明……
Input
輸入數據第一行為兩個整數n,m(3<=n,m<=20),表示地牢的大小,n行m列。接下來n行,每行m個字符,描述了地牢的地圖,".“代表通路,”#“代表巖石,”!“代表熔漿。輸入保證地牢是封閉的,即四周均是均是巖石或熔漿。接下來一行有四個字符"N”(北),“S”(南),“W”(西),“E”(東)的排列,表示Paris分別向NSWE四個方向走時Helen受磁石磁力影響的移動方向。
Output
輸出文件只有一行,如果Paris能找到Helen,輸出一整數d,為Paris最少需要行走的步數;如果Paris在255步之后仍找不到Helen,則輸出"Impossible"。注意相遇是指Paris與Helen最終到達同一個格子,或者二人在相鄰兩格移動后碰在了一起,而后者的步數算他們移動后的步數。
Sample Input
5 5 ##### #H..# #.!.# #.#P# ##### WNSESample Output
5
解釋:Paris行走方案為NNWWS,每步過后Helen位置在(2,2), (2,2), (3,2), (4,2), (3,2)。
就老老實實地用廣度優先搜索就好了
/// AC 代碼 #include <queue> #include <iostream> using namespace std; #include <cstring> const int MAXN = 22; char MAP[MAXN][MAXN]; int Meg[4]; // N S W E struct Node {int x1,x2,y1,y2,steps;Node (int x11=0,int y11=0,int x22=0,int y22=0,int s = 0){x1 = x11; x2 = x22; y1 = y11; y2 = y22; steps = s; } }; // N S W E int opx[4] = {-1, 1, 0, 0}; int opy[4] = {0, 0, -1, 1}; bool visited[MAXN][MAXN][MAXN][MAXN]; int n, m;Node bfs(Node now) {if(now.x1 == now.x2 && now.y1 == now.y2) return Node(0); queue<Node> q;q.push(now);int px,py,hx,hy;while(!q.empty()) {Node front = q.front();if (front.steps > 255) break; q.pop();for (int i = 0; i < 4; ++i) {px = front.x1 + opx[i];py = front.y1 + opy[i];if (px >= 0 && px < n && py >= 0 && py < m && MAP[px][py] != '!' && MAP[px][py] != '#') {hx = front.x2 + opx[Meg[i]];hy = front.y2 + opy[Meg[i]];if (hx >= 0 && hx < n && hy >= 0 && hy < m && MAP[hx][hy] != '!') {if (MAP[hx][hy] == '#') {hx = front.x2; hy = front.y2; }if (!visited[px][py][hx][hy]) {visited[px][py][hx][hy] = true;if (front.x1 == hx && front.y1 == hy && front.x2 == px && front.y2 == py ) {return Node(px,py,hx,hy,front.steps + 1);} else if (px == hx && py == hy) {return Node(px,py,hx,hy,front.steps + 1);}q.push(Node(px,py,hx,hy,front.steps + 1));} }}}}return Node(0,0,0,0,256); } int main(){ // freopen("E:\\Code\\C++\\soj\\a.txt", "r", stdin);while(cin >> n>> m){Node now;memset(visited, false, sizeof(visited));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> MAP[i][j];if (MAP[i][j] == 'P') {now.x1 = i;now.y1 = j; } else if (MAP[i][j] == 'H') {now.x2 = i;now.y2 = j;}}}string s;cin >> s;for (int i = 0; i < 4; ++i) {if(s[i] == 'N')Meg[i] = 0;//Paris走時Helen的方向 else if(s[i] == 'S')Meg[i] = 1;else if(s[i] == 'W')Meg[i] = 2;else if(s[i] == 'E')Meg[i] = 3;} now = bfs(now);if(now.steps > 255) cout << "Impossible" << endl;else cout << now.steps << endl;} }總結
以上是生活随笔為你收集整理的BFS Sicily 1215: 脱离地牢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Soj题目分类 python代码)
- 下一篇: 数据结构期末考试题目---笔记(SYSU