hdu 2012 A计划 双层bfs

D - A计划
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit  Status

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
思路:题意比较明确,要求我们从s开始能否找到p,每走一步费时1,但是这是一个双层的,
如果遇到传输机会直接到达另一层,且不费时,但是时光机的另一层是墙的话就不可以走,
所以对于这种情况,我们就把时光机也变成墙,如果两边都是时光机我们也需要全部都变成墙,
对于两层之间的变换,我们需要一个三维数组,来存储,并标记是否走过(当然也可以把走过的都变成墙就好了)
,怎么样从这一层到另一层的变换呢?我还是看了网上大神的做法,第一层为0,第二层为1的话,
每次异或就可以了,剩下的就需要四个方向的bfs直到找到公主就好了;
ac代码:
#include   
#include   
#include   
#include   
using namespace std;
char map[3][12][12];
bool book[3][12][12];
int n,m,T,c;
struct node{
	int x,y,z;
	int t;
};
queueQ;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool check(int x , int y)
{    if (x < 0 || y < 0 || x >= n || y >= m) return false;  
    return true;  
}
bool bfs()
{    
      int i;
      node q,p;
      p.x=0;
      p.y=0;
      p.z=0;
      p.t=T;
      book[0][0][0]=true;
      Q.push(p);
      while(!Q.empty())
      {    q=Q.front();
           Q.pop();
           if(map[q.x][q.y][q.z]=='P')
             {  if(q.t>=0)
                  return true;
                else
                  break;}
            for(i=0;i<4;i++)
            {  p=q;
               p.y=p.y+dir[i][0];
               p.z=p.z+dir[i][1];
               p.t=p.t-1;
               if(!check(p.y,p.z))
                 continue;
                if(map[p.x][p.y][p.z]=='#')
                      p.x^=1;
               if(!book[p.x][p.y][p.z]&&map[p.x][p.y][p.z]!='*'&&p.t>=0)
               {      
                      book[p.x][p.y][p.z]=true;
                      Q.push(p);
                       
                    
			   }
			}
	  }
	  return false;


}
int main()
{      int i,j,k;
     scanf("%d",&c);
     while(c--)
     {   scanf("%d%d%d",&n,&m,&T);
         memset(book,false,sizeof(book));
         while (!Q.empty()) Q.pop();    
         for(i=0;i<2;i++)
           for(j=0;j		    for(j=0;j			 for(k=0;k					if(map[i][j][k]=='#'&&map[1^i][j][k]=='#')
					     {  map[i][j][k]='*';
					        map[1^i][j][k]='*';
						  } 
					if(map[i][j][k]=='#'&&map[1^i][j][k]=='*')
					   map[i][j][k]='*';
			   }
			}
			}
			if(bfs())
			 printf("YES\n");
			else
			 printf("NO\n");
            
	 }
	 return 0;
}


你可能感兴趣的:(hdu,基础题,搜索)