HDU 2102 A计划

Posted on 2011-10-06 16:11  杀杀傻  阅读(336)  评论(0)    收藏  举报

                                               A计划

                                                                    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                    Total Submission(s): 4404    Accepted Submission(s): 1000


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
 

Recommend
xhd
 
               题目是简单的宽搜,只是要注意传送门。
               
View Code
  1 #include<stdio.h>
2 struct PlanA
3 {
4 int x,y,wf,s;
5 } Save[10000001];
6 int map[3][21][21],mark[3][21][21];
7 int dx[5]={-1,1,-1,0,0},dy[5]={-1,0,0,-1,1};
8 int reset(int n,int m)
9 {
10 for(int i=1;i<=n;i++)
11 {
12 for(int j=1;j<=m;j++)
13 {
14 map[1][i][j]=0;
15 map[2][i][j]=0;
16 mark[1][i][j]=0;
17 mark[2][i][j]=0;
18 }
19 }
20 }
21 int main()
22 {
23 int N;
24 scanf("%d",&N);
25 for(int time=1;time<=N;time++)
26 {
27 int n,m,T;
28 scanf("%d%d%d",&n,&m,&T);
29 reset(n,m);
30 int p=1,q=0;
31 int xs,ys,fs,xp,yp,fp;
32 char cs=getchar();
33 for(int count=1;count<=n*m+n;count++)
34 {
35 char c=getchar();
36 if(c=='S') {map[1][p][++q]=1; xs=p; ys=q; fs=1;}
37 if(c=='*') {map[1][p][++q]=-1;}
38 if(c=='P') {map[1][p][++q]=0; xp=p; yp=q; fp=1;}
39 if(c=='.') {map[1][p][++q]=0;}
40 if(c=='#') {map[1][p][++q]=2;}
41 if(q==m) {p++; q=0;}
42 }
43 char sc=getchar();
44 p=1; q=0;
45 for(int count=1;count<=n*m+n;count++)
46 {
47 char c=getchar();
48 if(c=='S') {map[2][p][++q]=1; xs=p; ys=q; fs=2;}
49 if(c=='*') {map[2][p][++q]=-1;}
50 if(c=='P') {map[2][p][++q]=0; xp=p; yp=q; fp=2;}
51 if(c=='.') {map[2][p][++q]=0;}
52 if(c=='#') {map[2][p][++q]=2;}
53 if(q==m) {p++; q=0;}
54 }
55 for(int i=1;i<=n;i++)
56 {
57 for(int j=1;j<=m;j++)
58 {
59 if(map[1][i][j]==2&&map[2][i][j]==2) {map[1][i][j]=map[2][i][j]=-1;}
60 if(map[1][i][j]==-1&&map[2][i][j]==2) {map[1][i][j]=map[2][i][j]=-1;}
61 if(map[1][i][j]==2&&map[2][i][j]==-1) {map[1][i][j]=map[2][i][j]=-1;}
62 }
63 }
64 int f=1,r=1;
65 Save[f].x=xs,Save[f].y=ys,Save[f].wf=fs,Save[f].s=0,mark[fs][xs][ys]=1;
66 int t=0;
67 while(f<=r&&t==0)
68 {
69 int x=Save[f].x,y=Save[f].y,wf=Save[f].wf,s=Save[f].s;
70 for(int i=1;i<=4;i++)
71 {
72 int xn=x+dx[i],yn=y+dy[i];
73 if(xn>0&&yn>0&&xn<=n&&yn<=m)
74 {
75 if(mark[wf][xn][yn]==0&&map[wf][xn][yn]!=-1)
76 {
77 if(map[wf][xn][yn]==2)
78 {
79 mark[wf][xn][yn]=1;
80 if(mark[3-wf][xn][yn]==0)
81 {
82 mark[3-wf][xn][yn]=1;
83 r++;
84 Save[r].x=xn; Save[r].y=yn; Save[r].wf=3-wf; Save[r].s=s+1;
85 if(3-wf==fp && xn==xp && yn==yp)
86 {
87 t=Save[r].s;
88 }
89 }
90 }
91 if(map[wf][xn][yn]==0)
92 {
93 mark[wf][xn][yn]=1;
94 r++;
95 Save[r].x=xn; Save[r].y=yn; Save[r].wf=wf; Save[r].s=s+1;
96 if(wf==fp && xn==xp && yn==yp)
97 {
98 t=Save[r].s;
99 }
100 }
101 }
102 }
103 }
104 f++;
105 }
106 if(t<=T&&t!=0) {printf("YES\n");}
107 else {printf("NO\n");}
108 }
109 return 0;
110 }
            
                   原创,转载请注明出处。
                                                                                                                                           By  YkyOI

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3