1. 程式人生 > >HDU 2102 A計劃(廣度優先搜尋+資料)

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