1. 程式人生 > >HDU 2102 三維dfs+坑點

HDU 2102 三維dfs+坑點

要求:可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出訊息說將在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") ;     
	}
}