BFS基础_HDU1312_dfs递归/栈实现+bfs实现

Posted kid-yln

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS基础_HDU1312_dfs递归/栈实现+bfs实现相关的知识,希望对你有一定的参考价值。

原题:hdu1312

B: 不要停下来啊

题目描述

丁丁妹因为上山挖大头菜而误打误撞进入了一处古代遗迹,古代遗迹是一个n×m 的迷宫,
丁丁妹所处的位置用‘@‘标出,‘.‘表示道路,‘#‘表示墙壁。
为了逃出迷宫,丁丁妹想知道她最长能在迷宫中走多少格。
我们的目的地根本不重要,只要继续前行就好了,只要不止步,路就在前方!
所以,不要停下来啊……

输入描述

多组数据,第一行为一个正整数T  ,表示数据组数。
接下来T 组数据,每组格式如下:
第一行为两个正整数n,m 描述了迷宫的大小。
接下来一个n×m  的矩阵,元素mat[i][j]是‘@‘,‘.‘,‘#‘三者之一,意义见题目描述。
数据保证:1≤n≤20,1≤m≤20 

 

bfs套路queue实现:

技术图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include<queue>
 6 using namespace std;
 7 
 8 int n,m;
 9 int T;
10 char s[25][25];
11 int dis[4][2]= { //四个方向 ,[][0]代表x轴上的变动,[][1]代表y轴上的变动
12     {0,1},
13     {0,-1},
14     {1,0},
15     {-1,0}//
16 };
17 struct d {
18     int x,y;
19 };
20 int a,b;
21 int ans=0;
22 int check(int x,int y) {
23     if(s[x][y]==.) {
24         return 1;
25     } else {
26         return 0;
27     }
28 }
29 void f(int x,int y) {
30     queue<d> q;
31     d begin,next;
32     begin.x=x;
33     begin.y=y;
34     ans=1;
35     q.push(begin);
36     while(!q.empty()) {
37         begin=q.front();
38         q.pop();
39         for(int i=0; i<4; i++) {
40             next.x=begin.x+dis[i][1];
41             next.y=begin.y+dis[i][0];
42             if(check(next.x,next.y)==1) {
43                 s[next.x][next.y]=#;
44                 //cout<<next.x<<" "<<next.y<<endl;
45                 //这个题其实是在找以起点为开始找分叉树,有一点歧义吧
46                 //如果不是做过我会以为他是在找从起点到死胡同的最长路径,
47                 // 如果是那样的化就需要检查遇到死胡同的时候用max函数
48                 //而且不能标记路径而是,找完所有的死胡同
49 
50                 q.push(next);
51                 ans++;
52             }
53         }
54     }
55 }
56 
57 
58 int main() {
59     cin>>T;
60     while(T--) {
61         cin>>m>>n;
62         memset(s,#,sizeof(s));
63 
64         for(int i=1; i<=n; i++) {
65             for(int j=1; j<=m; j++) {
66                 cin>>s[i][j];
67                 if(s[i][j]==@) {
68                     a=i,b=j;
69                 }
70             }
71         }
72         /*
73         for(int i=0; i<=n+1; i++) {
74             for(int j=0; j<=m+1; j++) {
75                 cout<<s[i][j];
76             }
77             cout<<"
";
78         }
79         */
80         f(a,b);
81 
82         cout<<ans<<endl;
83 
84     }
85 
86 
87     return 0;
88 }
View Code

 

dfs递归/栈实现

技术图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <stack>
 6 using namespace std;
 7 int a,b;
 8 char s[24][24];
 9 int T;
10 int n,m;
11 int ans=0;
12 int dis[4][2]= {{1,0},{-1,0},{0,-1},{0,1}};
13 
14 void f1(int x,int y) {
15     for(int i=0; i<4; i++) {
16         int dx=x+dis[i][0];
17         int dy=y+dis[i][1];
18         if(s[dx][dy]==.) {
19             ans++;
20             s[dx][dy]=#;
21             f1(dx,dy);
22         }
23     }
24 }
25 
26 struct d {
27     int x,y;
28 };
29 void f2(int x,int y) {
30     stack<d> st;
31     d begin,next;
32     begin.x=x;
33     begin.y=y;
34     ans=1;
35     st.push(begin);
36 
37     while(!st.empty()) {
38         int g=0;
39         begin=st.top();
40         for(int i=0; i<4; i++) {
41             next.x=begin.x+dis[i][0];
42             next.y=begin.y+dis[i][1];
43             if(s[next.x][next.y]==.) {
44                 s[next.x][next.y]=#;
45                 ans++;
46                 st.push(next);
47                 g=1;
48                 break;
49             }
50         }
51         if(g==0)st.pop();
52 
53     }
54 
55 
56 }
57 
58 
59 int main () {
60 
61     while(cin>>m>>n) {
62         if(m==n&&n==0)break;
63     
64         memset(s,#,sizeof(s));
65 
66         for(int i=1; i<=n; i++) {
67             for(int j=1; j<=m; j++) {
68                 cin>>s[i][j];
69                 if(s[i][j]==@)a=i,b=j;
70             }
71         }
72         f1(a,b);//f2(a,b);
73     
74         cout<<ans<<endl;
75 
76     }
77     return 0;
78 }    
View Code

 

 

 

 

 

 

 

 

以上是关于BFS基础_HDU1312_dfs递归/栈实现+bfs实现的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1312 Red and Black(bfs,dfs均可,个人倾向bfs)

hdu1312 Red and Black

递归基础—组合数 / 排列数—输出的各种办法(dfs/递归/bfs)

HDU_5094_dfs

UVA - 10410 Tree Reconstruction(栈处理递归)

BFS和DFS的优劣和场景比较