HDU 2102 A計劃(廣度優先搜尋+資料)
A計劃
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17222 Accepted Submission(s): 4329
Problem Description 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮裡,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,牆用*表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是牆的話,那騎士們就會被撞死。騎士們在一層中只能前後左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。
Input 輸入的第一行C表示共有C個測試資料,每個測試資料的前一行有三個整數N,M,T。 N,M迷宮的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宮的第一層的佈置情況,後N*M表示迷宮第二層的佈置情況。
Output 如果騎士們能夠在T時刻能找到公主就輸出“YES”,否則輸出“NO”。
Sample Input 1 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#..
Sample Output YES
這個其實也就是簡單的廣搜,在開始的時候把'#'處理一下會好做很多,遇到上下兩層都是# 的,就把上下兩層的這個位置都弄成牆就行。還有遇到 一層是#,一層是牆的。也直接把倆都弄城牆就行,省的要判斷他撞死,步數不要多加,也不要少加,從' . '到'#',在從‘#’到另一層只需要加一步就ok了。(想測試資料的往下看)。。。
#include<stdio.h> #include<queue> #include<string.h> #include<algorithm> using namespace std; int book[2][15][15]; char a[2][15][15]; struct node { int x,y,z,step; }; int main() { int i,j,k,f,n,m,t,T; int ta,tb,tc,tx,ty,tz; int next [4][2]= {0,1,1,0,0,-1,-1,0}; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&t); getchar(); for(i=0; i<2; i++) { for(j=0; j<n; j++) { for(k=0; k<m; k++) scanf("%c",&a[i][j][k]); getchar(); } if(i!=1) getchar();//這個吸收中間那個空白行,注意只有一個空白行。 } for(i=0; i<2; i++) for(j=0; j<n; j++) { for(k=0; k<m; k++) if(a[i][j][k]=='P')//記錄公主的位置,順便把'P'改為'.',(純屬個人習慣)。 { ta=i; tb=j; tc=k; a[i][j][k]='.'; } else if(a[i][j][k]=='#'&&a[i^1][j][k]=='#')//如果這一層是#,另一層還是#,直接標記為牆就行。 { a[0][j][k]='*'; a[1][j][k]='*'; } else if(a[i][j][k]=='#'&&a[i^1][j][k]=='*')//這一層是#,另一層是牆,這樣會撞死(騎士也不傻)。 { a[0][j][k]='*'; a[1][j][k]='*'; } } memset(book,0,sizeof(book)); book[0][0][0]=1; queue<node>Q; node p,q; f=0; p.x=0,p.y=0,p.z=0,p.step=0; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); if(p.x==ta&&p.y==tb&&p.z==tc&&p.step<=t&&f==0) { f=1; // printf("%d\n",p.step); printf("YES\n"); break; } for(i=0; i<4; i++) { tx=p.x; ty=p.y+next[i][0]; tz=p.z+next[i][1]; if(a[tx][ty][tz]=='*'||book[tx][ty][tz]==1||tx<0||tx>1||ty<0||ty>n-1||tz<0||tz>m-1) continue; if(a[tx][ty][tz]=='.') { book[tx][ty][tz]=1; q.x=tx,q.y=ty,q.z=tz; q.step=p.step+1; Q.push(q); } else if(a[tx][ty][tz]=='#') { book[tx][ty][tz]=1; if(tx==0)//傳送門可以換層((⊙o⊙)哦,傳送門是什麼東東,怎麼聽著這麼熟悉)。 tx+=1; else tx-=1; if(a[tx][ty][tz]=='*'||book[tx][ty][tz]==1||tx<0||tx>1||ty<0||ty>n-1||tz<0||tz>m-1) continue; book[tx][ty][tz]=1; q.x=tx,q.y=ty,q.z=tz; q.step=p.step+1; Q.push(q); } } } while(!Q.empty()) Q.pop(); if(!f) printf("NO\n"); } return 0; }
輸入測試:
14 5 5 14 S*#*. .#... ..... ****. ...#. ..*.P #.*.. ***.. ...*. *.#.. 5 5 13 S*#*. ##... ..... ****. ...#. ..*.P ..*.. ***.. ...*. *.#.. 5 5 10 S*#*. .#... ....# ****. ...#. ..*.P #.*.* ***.. ...*. *.#.. 1 2 10 SP *. 1 3 2 S#P ..# 3 3 11 S.. *#. #.. ... .#. .*P 5 5 11 S*#*. .#... ..... ****. P.*#. ..*.. #.*.. ***.. ...*. *#.#. 5 5 12 S*#*. .#... ..... ****. P.*#. ..*.. #.*.. ***.. ...*. *#.#. 5 5 12 S*#*. .#... ..... ****. P.*#. ..*.. #.*.. ***.. ...*. *.##. 5 5 3 S*#*. .#... ..... ****. ..*#. .P*.. #.*.. ***.. ...*. *#.#. 5 5 9 S*#*. .#... ..... ****. ..*#. ..*.. #.*.. ***.. ...*. *#.P. 4 5 7 S*#*. ...** .#.** ****. .*.*. .#*.. #.#.. .#.*P 5 7 12 S*****P .#.*#*. **.#.*. .*****. ....... ******* *.#*... ***.#*# ******* ******* 3 3 3 S#P .*. ... .## ... ...
輸出:
YES
NO
YES
YES
YES
NO
NO
NO
NO
YES
YES
NO
YES
NO
相關推薦
HDU 2102 A計劃(廣度優先搜尋+資料)
A計劃 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17222 Accepted Submissi
HDU 2102 A計劃(簡單DFS)
ont inpu clu 通過 csdn input tin 一次 != Description 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國
Find a way (廣度優先搜索)
需要 sam namespace 比較 建立 繼續 tip total lag 題目: Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo o
演算法之BFS(廣度優先搜尋演算法)
</pre><pre> #include<stdio.h> /*有8個城市,編號分別為0~7,求從0號城市到7號城市的最短路線*/ int jz[8][8]= {
HDU 2102 A計劃 DFS與BFS兩種寫法
blog ons bsp 求解 stream eof node 耗時 {} 1.題意:一位公主被困在迷宮裏,一位勇士前去營救,迷宮為兩層,規模為N*M,迷宮入口為(0,0,0),公主的位置用‘P‘標記;迷宮內,‘.‘表示空地,‘*‘表示墻,特殊的,‘#‘表示時空傳輸機,走到
HDU 2102 A計劃
air oid clas als rac then track map tmp 水bfs。 僅僅須要推斷一下 #之後還是*或#都是死路。 僅僅有兩層。 #include<cstdio> #include<cstring> #inclu
HDU 2102 A計劃 【BFS】
node 二層 output bool pan set spa 右移 als <題目鏈接> 題目大意: 可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能
演算法----圖的遍歷(深度優先搜尋DFS、廣度優先搜尋BFS)
圖的遍歷的定義:從圖的某個頂點出發訪問圖中所有的點,且每個頂點僅被訪問一次。 深度優先搜尋DFS: 準備:指定的起始點和終點,確定好當前點與鄰接點之間的偏移值、結束搜尋的條件、符合訪問的點所需條件、回溯處理; (1)若當前點的鄰接點有未被訪問的,則選一個進行訪問; (2)若當前點的鄰接點都不符合訪問條
1091. Acute Stroke (30)-PAT甲級真題(廣度優先搜尋)
1091. Acute Stroke (30)One important factor to identify acute stroke (急性腦卒中) is the volume of the str
Catch That Cow poj 4001(抓住那頭牛!) BFS(廣度優先搜尋)
題目連結 其實就是求最短路徑問題,採用BFS即可。 AC程式碼如下: #include <iostream> #include <queue> using namespace std; const int maxn=2e5+5; bool vis[maxn];
DFS(深度優先搜尋),BFS(廣度優先搜尋)小總結
這周正在學習DFS和BFS。 體驗中覺得這兩個演算法還是挺好用的,但是遇到某些資料大的情況就很容易超時。(所以到後面還是得學習一下如何優化,或者採用更佳的搜尋方法來解決問題) 然後學習了一段時間,感覺基本上了解了DFS和BFS的基礎實現原理以及應用(不過我認為還是得通過做題來培養自己的感覺,
HDU-2102 A計劃 BFS
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; char map[2][15][15], hash[2]
圖的遍歷(廣度優先搜尋遍歷)
1、廣度優先搜尋遍歷過程 (1)從某個頂點V出發,訪問該頂點的所有鄰接點V1,V2..VN (2)從鄰接點V1,V2...VN出發,再訪問他們各自的所有鄰接點 (3)重複上述步驟,直到所有的頂點都被訪問過 若此時圖中還有頂點未被訪問,則在外控演算法的控制下,另選一
藍橋杯 第十題 分酒 (BFS(廣度優先搜尋)
分酒 泊松是法國數學家、物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分佈。 有一次閒暇時,他提出過一個有趣的問題,後稱為:“泊松分酒”。在我國古代也提出過類似問題,遺憾的是沒有進行徹底探索,其中
Hrbust oj 1316 移動 II——BFS(廣度優先搜尋)
移動 IITime Limit: 1000 MSMemory Limit: 65536 KTotal Submit: 487(147 users)Total Accepted: 219(137 users)Rating: Special Judge: NoDescriptio
無權最短路徑BFS(廣度優先搜尋)演算法(圖論)
廣度優先搜尋(BFS)演算法類似於樹中的層次搜尋: 從任意點s出發,先遍歷與s相鄰的點,然後再遍歷於相鄰的點相鄰的點。注意有向圖必須是順方向的鄰接點。 為什麼說廣度優先搜尋可以用來求無權最短路徑呢?因為,廣度優先搜尋每次都會先發現距離s為k的所有頂點,然後才會 發現距離s
迷宮問題的求解(廣度優先搜索)
struct -o font 使用 sin 將在 地圖 數據 c++ 迷宮問題很容易可以理解為廣度優先搜索問題,站在一個點上,首先試一試自己周圍的點是否可以走,如果是路則加入待走隊列,如果是墻則丟棄。迷宮問題在廣度優先搜索的時候需要特別註意的就是要及時拋棄,遇到走
Light OJ 1006 Hex-a-bonacci(記憶化搜尋優化)
Given a code (not optimized), and necessary inputs, you have to find the output of the code for the inputs. The code is as follows: int a, 
深度優先搜尋(DFS)與廣度優先搜尋(BFS)
深度優先搜尋的基本模型 void dfs(int step) { 判斷邊界 嘗試每一種可能 for(int i=0; i<n; i++) { 繼續下一步 dfs(step+1); } 返回 } 輸出一個
DOM中BFS(廣度優先遍歷)和DFS(深度優先遍歷)的方法
廣度優先遍歷,即父層遍歷結束,才開始遍歷子層,然後一直往下遍歷,如果是下面這樣一顆DOM樹 <div class="root"> <div class="container"> <section cla