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") ;     
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值