HDU 2102 三維dfs+坑點
阿新 • • 發佈:2019-01-07
要求:可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在T時刻吃掉公主,因為他聽信謠言說吃公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以為常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮裡,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,牆用*表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是牆的話,那騎士們就會被撞死。騎士們在一層中只能前後左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。
如果騎士們能夠在T時刻能找到公主就輸出“YES”,否則輸出“NO”。
方法:bfs
1.騎士們在T時刻找到的意思是不超過T時刻找到。
2.設定一個三維x,y,z的結構體就行。
3.傳送到傳送門是坑點。題目中說傳送到牆會死,那麼傳送到傳送門會無限傳送,故傳送到牆和傳送門都不行!
#include<iostream> #include<stdio.h> #include<queue> #include<map> #include<string.h> #include<math.h> #include<algorithm> #define inf 0x3f3f3f3f using namespace std ; int n , m , t ; int px , py , pz ; int flag ; char map1[10][15][15] ; int used[10][15][15] ; int row[4] = {0 , 0 , -1 , 1} ; int col[4] = {-1 , 1 , 0 , 0} ; struct node { int x , y , z ; int step ; } ; queue <node> q ; void bfs() { int i , j , k ; node a , b , c ; while(!q.empty()) q.pop() ; memset(used , 0 , sizeof(used)) ; a.x = 0 , a.y = 0 , a.z = 0 ; a.step = 0 ; used[a.x][a.y][a.z] = 1 ; q.push(a) ; while(!q.empty()) { a = q.front() ; q.pop() ; if(map1[a.x][a.y][a.z] == '#') { if((map1[1 - a.x][a.y][a.z] == '*' ||map1[1 - a.x][a.y][a.z] == '#') && !used[1 - a.x][a.y][a.z]) continue ; else { a.x = 1 - a.x ; used[a.x][a.y][a.z] = 1 ; } } if(map1[a.x][a.y][a.z] == 'P' && a.step <= t) { flag = 1 ; return ; } for(i = 0 ; i < 4 ; i ++) { b.x = a.x ; b.y = a.y + row[i] ; b.z = a.z + col[i] ; if(b.y >= 0 && b.y < n &&b.z >= 0 && b.z < m &&map1[b.x][b.y][b.z] != '*' &&!used[b.x][b.y][b.z]) { used[b.x][b.y][b.z] = 1 ; b.step = a.step + 1 ; q.push(b) ; } } } } int main()//記得寫三維部落格 { int c ; int i , j , k ; scanf("%d" , &c) ; while(c--) { scanf("%d%d%d" , &n , &m , &t) ; for(i = 0 ; i < 2 ; i ++) for(j = 0 ; j < n ; j ++) { scanf("%s" , map1[i][j]) ; for(k = 0 ; k < m ; k ++) if(map1[i][j][k] == 'P') px = i , py = j , pz = k ; } flag = 0 ; bfs() ; if(flag) printf("YES\n") ; else printf("NO\n") ; } }