A计划

A计划

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 26   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

1
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.P
#.*..
***..
...*.
*.#..

Sample Output

YES

Source

公主被绑架了,你有迷宫的地图,该迷宫只有两层楼#表示楼梯,.表示空地,*表示墙,第一行输入N,M,K,表示需要输入两个N*M的矩阵地图,起始点为S,公主的位置为P,问你能否在限定的K步之内,找到公主。如果能的话输出YES,否则输出NO.

HDU 2007-6 Programming Contest
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 int Len_X,Len_Y,D,SIGN;
  4 char Map[20][20][5];
  5 int DFS(int x,int y,int z,int d,int D)
  6 {
  7     int ii,jj;
  8     if(SIGN==1)return 0;
  9     if(x>=Len_X||x<0||y>=Len_Y||y<0||d>D)return 0;
 10     if(d<=D&&Map[x][y][z]=='P'){SIGN=1;return 1;}
 11     if(Map[x][y][z]=='#')
 12     {
 13         if(z==0&&(Map[x][y][1]!='*'&&Map[x][y][1]!='#'))
 14         {
 15             DFS(x,y,1,d,D);Map[x][y][1]='.';return 0;
 16         }
 17         else if(z==1&&(Map[x][y][0]!='*'&&Map[x][y][0]!='#'))
 18         {
 19             DFS(x,y,0,d,D);Map[x][y][0]='.';return 0;
 20         }
 21         else return 0;
 22     }
 23         if(d>=D)return 0;
 24     if(Map[x][y][z]=='*')return 0;
 25     else Map[x][y][z]='*';
 26   /* getch();
 27     putchar('\n');
 28     printf("\tStyp: %d\n",d);
 29             for(ii=0;ii<Len_X;ii++)
 30             {
 31                 if(z==1)putchar('\t');
 32                 for(jj=0;jj<Len_Y;jj++)
 33                 {
 34                     printf("%c",Map[ii][jj][z]);
 35                 }
 36                 putchar('\n');
 37             }*/
 38     if(x+1<Len_X&&Map[x+1][y][z]!='*')
 39     {
 40         DFS(x+1,y,z,d+1,D);
 41         if(Map[x+1][y][z]!='#')
 42             Map[x+1][y][z]='.';
 43     }
 44     if(x-1>=0&&Map[x-1][y][z]!='*')
 45     {
 46         DFS(x-1,y,z,d+1,D);
 47         if(Map[x-1][y][z]!='#')
 48             Map[x-1][y][z]='.';
 49     }
 50     if(y+1<Len_Y&&Map[x][y+1][z]!='*')
 51     {
 52         DFS(x,y+1,z,d+1,D);
 53         if(Map[x][y+1][z]!='#')
 54             Map[x][y+1][z]='.';
 55     }
 56     if(y-1>=0&&Map[x][y-1][z]!='*')
 57     {
 58         DFS(x,y-1,z,d+1,D);
 59         if(Map[x][y-1][z]!='#')
 60             Map[x][y-1][z]='.';
 61     }
 62     return 0;
 63 }
 64 
 65 int main()
 66 {
 67     int Begin_x,Begin_y,Begin_z,i,j,T;
 68     scanf("%d",&T);
 69     while(T--)
 70     {
 71         scanf("%d%d%d",&Len_X,&Len_Y,&D);
 72             getchar();
 73             for(i=0;i<Len_X;i++)
 74             {
 75                 for(j=0;j<Len_Y;j++)
 76                 {
 77                     scanf("%c",&Map[i][j][0]);
 78                     if(Map[i][j][0]=='S')
 79                     {Begin_x=i;Begin_y=j;Begin_z=0;}
 80                 }
 81                 getchar();
 82             }
 83             getchar();
 84             for(i=0;i<Len_X;i++)
 85             {
 86                 for(j=0;j<Len_Y;j++)
 87                 {
 88                     scanf("%c",&Map[i][j][1]);
 89                     if(Map[i][j][1]=='S')
 90                     {Begin_x=i;Begin_y=j;Begin_z=1;}
 91                 }
 92                 getchar();
 93             }
 94             SIGN=0;
 95             DFS(Begin_x,Begin_y,Begin_z,0,D);
 96             if(SIGN==1)
 97                 printf("YES\n");
 98             else
 99                 printf("NO\n");
100         }
101     return 0;
102 }
View Code

修改:2015.5.8

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int Len_X,Len_Y,D,SIGN;
 4 int Begin_x,Begin_y,Begin_z;
 5 char Map[20][20][5];
 6 void DFS(int x,int y,int z,int d,int D)
 7 {
 8    // printf("\t%d %d %d\n",x,y,z);
 9     if(SIGN==1)return ;
10     if(d>D)return ;
11     if(Map[x][y][z]=='*')return;
12     if(d<=D&&Map[x][y][z]=='P'){SIGN=1;return ;}
13     if(Map[x][y][z]=='#')
14     {
15         Map[x][y][z]='*';
16         if(z==0)DFS(x,y,1,d,D);
17         else DFS(x,y,0,d,D);
18         Map[x][y][z]='#';
19     }
20     else if(Map[x][y][z]=='.')
21     {
22         Map[x][y][z]='*';
23         DFS(x-1,y,z,d+1,D);
24         DFS(x+1,y,z,d+1,D);
25         DFS(x,y-1,z,d+1,D);
26         DFS(x,y+1,z,d+1,D);
27         Map[x][y][z]='.';/*和步数有关,需要点还原*/
28     }
29     return ;
30 }
31 void Input(int z)/*输入地图*/
32 {
33     int i,j;
34     for(i=0;i<=Len_X+1;i++)
35     {
36         for(j=0;j<=Len_Y+1;j++)
37         {
38             if(i==0||j==0||i==Len_X+1||j==Len_Y+1){Map[i][j][z]='*';}
39             else
40             {
41                 scanf(" %c",&Map[i][j][z]);
42                 if(Map[i][j][0]=='S')
43                 {
44                     Map[i][j][0]='.';
45                     Begin_x=i;Begin_y=j;Begin_z=0;
46                 }
47             }
48         }
49     }
50     return ;
51 }
52 int main()
53 {
54     int T;
55     scanf("%d",&T);
56     while(T--)
57     {
58         scanf("%d%d%d",&Len_X,&Len_Y,&D);
59         Input(0);Input(1); SIGN=0;
60         DFS(Begin_x,Begin_y,Begin_z,0,D);
61         if(SIGN==1) printf("YES\n");
62         else printf("NO\n");
63         }
64     return 0;
65 }
View Code

 

posted @ 2014-05-24 20:21  Wurq  阅读(259)  评论(0编辑  收藏  举报