HDU 2102 A計劃 DFS與BFS兩種寫法
阿新 • • 發佈:2017-07-03
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兩種寫法