1. 程式人生 > >HDU 2102 A計劃 DFS與BFS兩種寫法

HDU 2102 A計劃 DFS與BFS兩種寫法

blog ons bsp 求解 stream eof node 耗時 {}

1.題意:一位公主被困在迷宮裏,一位勇士前去營救,迷宮為兩層,規模為N*M,迷宮入口為(0,0,0),公主的位置用‘P‘標記;迷宮內,‘.‘表示空地,‘*‘表示墻,特殊的,‘#‘表示時空傳輸機,走到這裏就會被傳輸到另一層的相對位置;在迷宮內沒走動一步耗時為1,最終求解是否能在T時刻解救到公主;

2.輸入輸出:第一行C表示C組數據,每一組內N,M,T給出的迷宮規模與時間,接著給出了雙層迷宮的內容;若是能找到公主輸出"YES",否則"NO";

3.分析:這裏原題意判斷是否能在T時刻找到,然而要是寫搜索判斷有沒有"時刻為T且位置為P"的狀態,會超時,所以直接判斷能不能在T時刻之前就找到;

BFS版:求出到達P處的最短時間並判斷是否小於T;DFS版:找到第一個"時刻小於T且位置為P的狀態"就返回;

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <queue>
 4 # include <cstring>
 5 using namespace std;
 6 const int maxn=15;
 7 int N,M,T;
 8 int dx[4]={0,0,-1,1};
 9 int dy[4]={-1,1,0,0};
10 char maze[2][maxn][maxn];
11 int vis[2][maxn][maxn];
12 struct Node
13 {
14     int
l,x,y,t; 15 Node(){} 16 Node(int ll,int xx,int yy,int tt) 17 { 18 l=ll; 19 x=xx; 20 y=yy; 21 t=tt; 22 } 23 }; 24 void Init() 25 { 26 scanf("%d%d%d",&N,&M,&T); 27 for(int i=0;i<2;i++) 28 for(int j=0;j<N;j++) 29 scanf("
%s",maze[i][j]); 30 memset(vis,0,sizeof(vis)); 31 } 32 void Solve() 33 { 34 int ans=-1; 35 queue<Node> Q; 36 vis[0][0][0]=1; 37 Q.push(Node(0,0,0,0)); 38 while(!Q.empty()) 39 { 40 Node temp=Q.front(); 41 Q.pop(); 42 if(temp.t<=T&&maze[temp.l][temp.x][temp.y]==P) 43 { 44 ans=1; 45 break; 46 } 47 if(temp.t>T) break; 48 for(int i=0;i<4;i++) 49 { 50 int nx=temp.x+dx[i]; 51 int ny=temp.y+dy[i]; 52 if(nx>=0&&ny>=0&&nx<N&&ny<M&&maze[temp.l][nx][ny]!=*&&!vis[temp.l][nx][ny]) 53 { 54 if(maze[temp.l][nx][ny]!=#)//"." 55 { 56 vis[temp.l][nx][ny]=1; 57 Q.push(Node(temp.l,nx,ny,temp.t+1)); 58 } 59 else//‘#‘ 60 { 61 vis[temp.l][nx][ny]=vis[!temp.l][nx][ny]=1; 62 if(maze[!temp.l][nx][ny]!=*&&maze[!temp.l][nx][ny]!=#) 63 Q.push(Node(!temp.l,nx,ny,temp.t+1)); 64 } 65 } 66 } 67 } 68 if(ans>0) printf("YES\n"); 69 else printf("NO\n"); 70 } 71 int main() 72 { 73 //freopen("in.txt","r",stdin); 74 //freopen("out.txt","w",stdout); 75 int C; 76 scanf("%d",&C); 77 while(C--) 78 { 79 Init(); 80 Solve(); 81 } 82 return 0; 83 }
 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <cstdlib>
 5 using namespace std;
 6 const int MAXN=15;
 7 char Maze[2][MAXN][MAXN];
 8 int dx[4]={1,-1,0,0};
 9 int dy[4]={0,0,1,-1};
10 int vis[2][MAXN][MAXN];
11 int N,M,T,f;
12 void Init()
13 {
14     f=0;
15     scanf("%d%d%d",&N,&M,&T);
16     for(int k=0;k<2;k++)
17         for(int i=0;i<N;i++)
18             scanf("%s",Maze[k][i]);
19     memset(vis,0,sizeof(vis));
20 }
21 void dfs(int k,int x,int y,int t)
22 {
23     if(f) return;
24     if(t<T&&Maze[k][x][y]==P)
25     {
26         f=1;
27         return;
28     }
29     if(t==T)
30     {
31         if(Maze[k][x][y]==P)
32             f=1;
33         return;
34     }
35     for(int i=0;i<4;i++)
36     {
37         int nx=x+dx[i];
38         int ny=y+dy[i];
39         if(nx>=0&&ny>=0&&nx<N&&ny<M&&Maze[k][nx][ny]!=*)
40         {
41             if(Maze[k][nx][ny]!=#&&!vis[k][nx][ny])
42             {    
43                 vis[k][nx][ny]=1;
44                 dfs(k,nx,ny,t+1);
45                 vis[k][nx][ny]=0;
46             }
47             else
48             {
49                 if(Maze[!k][nx][ny]!=#&&Maze[!k][nx][ny]!=*)
50                     if(!vis[k][nx][ny]&&!vis[!k][nx][ny])
51                     {
52                         vis[!k][nx][ny]=vis[k][nx][ny]=1;
53                         dfs(!k,nx,ny,t+1);
54                         vis[!k][nx][ny]=vis[k][nx][ny]=0;
55                     }
56             }
57         }
58     }
59 }
60 void Solve()
61 {
62     dfs(0,0,0,0);
63     if(f) printf("YES\n");
64     else printf("NO\n");
65 }
66 int main()
67 {
68     //freopen("in.txt","r",stdin);
69     //freopen("out.txt","w",stdout);
70     int C;
71     scanf("%d",&C);
72     while(C--)
73     {
74         Init();
75         Solve();
76     }
77     return 0;
78 }

HDU 2102 A計劃 DFS與BFS兩種寫法