ACM 搜索 hdu 2102 A计划

来源:互联网 发布:装修大数据公司排名 编辑:程序博客网 时间:2024/06/05 23:23
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
15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..
 

Sample Output
YES

 

很有意思的一道题,没必要准备两个数组。    直接建立一个三维数组,第一个括号的数值代表层数即可,注意也是不一定只有一个传送器,所以不要想当然的撞墙直接死,应该coninue,返回重来。

  1. #include<iostream>  
  2. #include<queue>  
  3. using namespace std;  
  4.   
  5. struct point{  
  6.     int x,y,step,type;  
  7. }   P[105];  
  8. char mp[2][12][12];  
  9. int M,N,T,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};  
  10.   
  11. int bfs(point X)  
  12. {  
  13.     point t,tt;  
  14.     queue<point> Q;  
  15.     Q.push(X);  
  16.     while(!Q.empty())  
  17.     {  
  18.         t=Q.front();  
  19.         Q.pop();  
  20.         if(mp[t.type][t.x][t.y]=='*')   continue;  
  21.         if(mp[t.type][t.x][t.y]=='P')   return 1;  
  22.         mp[t.type][t.x][t.y]='*';  
  23.         for(int i=0;i<4;i++){  
  24.             tt.x=t.x+dir[i][0];tt.y=t.y+dir[i][1];tt.step=t.step+1;tt.type=t.type;  
  25.             if(tt.step>T||mp[tt.type][tt.x][tt.y]=='*')  continue;  
  26.               
  27.             if(mp[tt.type][tt.x][tt.y]=='#'){               //如果是#  
  28.                 mp[tt.type][tt.x][tt.y]=='*';               //变为*  
  29.                 tt.type=1-tt.type;                          //传送到另一层   
  30.                 if(mp[tt.type][tt.x][tt.y]=='#'||mp[tt.type][tt.x][tt.y]=='*'){         //忽略   
  31.                     mp[tt.type][tt.x][tt.y]=mp[1-tt.type][tt.x][tt.y]='*';          //变为*   
  32.                     continue;                               //换个方向  
  33.                 }  
  34.             }  
  35.             Q.push(tt);  
  36.         }  
  37.     }  
  38.     return 0;  
  39. }  
  40.   
  41. int main()  
  42. {  
  43.     int i,j,C;  
  44.     point S;  
  45.     scanf("%d",&C);  
  46.     while(C--)  
  47.     {  
  48.         memset(mp,'*',sizeof(mp));  
  49.         cin>>M>>N>>T;  
  50.         for(i=1;i<=M;i++)    for(j=1;j<=N;j++)    cin>>mp[0][i][j];  
  51.         for(i=1;i<=M;i++)    for(j=1;j<=N;j++)    cin>>mp[1][i][j];  
  52.           
  53.         S.x=1;S.y=1;S.step=0;S.type=0;  
  54.           
  55.         if(bfs(S))  printf("YES\n");  
  56.         else        printf("NO\n");  
  57.     }  
  58.     return 0;  
  59. }  

0 0
原创粉丝点击