2019蓝桥杯 E.迷宫 bfs

在这里插入图片描述

30 50
01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

在这里插入图片描述


个人感悟:

当时做这个题目bfs被我写出来了,但还是没能写出来。
当时也不知道那个优先级应该怎么搞,考完问学长,才知道只要方向搜索的时候按照那个优先级来就可以。
还有最重要的一点:这种迷宫bfs不需要距离松弛,我总是搞混了


题解思路:

1 1、 首先先 b f s bfs 倒搜一遍,就是反过来,把终点看成起点,起点看成终点,所以 d i s [ i ] [ j ] dis[i][j] 为点 ( i , j ) (i,j) 到终点的距离。
2 2、 然后从起点出发,沿着比当前 d i s dis 1 1 的方向走,直至终点就可以了。

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
const int maxn = 100+10;
typedef pair<int ,int > PII;

int dis[maxn][maxn];
string G[maxn];
int n,m;
int dx[] = {1,0,0,-1}, dy[] = {0,-1,1,0};
char dir[]={'D','L','R','U'};


void bfs(){                          //倒搜,bfs不需要松弛炒作
	memset(dis,-1,sizeof dis);
	dis[n-1][m-1] = 0;
	queue<PII> q;
	q.push({n-1,m-1});
	while(!q.empty()){
		PII p = q.front(); q.pop();

		if(p.first == 0 && p.second == 0) 
			return ;

		for(int i = 0; i < 4; i++){
			int x = dx[i] + p.first;
			int y = dy[i] + p.second;
			if(x >= 0 && x < n && y >= 0 && y < m && G[x][y] == '0' && dis[x][y] == -1){

					dis[x][y] = dis[p.first][p.second] + 1;
					q.push({x,y});
			}
		}
	}
}
int main()
{

	
	cin>>n>>m;
	for(int i=0;i<n;i++) cin>>G[i];
	
	bfs();
	//cout<<dis[0][0]<<endl;    //打印距离
	//打印dis数组
	/*for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(dis[i][j]==-1) printf("%3s","#");
			else printf("%3d",dis[i][j]);
		}
		cout<<endl;
	}*/
	int x = 0, y = 0;
	string res="";
	while(x != n-1 || y!= m-1){
		for(int i = 0; i < 4; i ++){
			int nx = x + dx[i], ny = y + dy[i];
			if(nx >=0 && nx < n && ny >=0 && ny <m && G[nx][ny] == '0'){

				if(dis[nx][ny] +1 == dis[x][y] ){
					x = nx , y =ny;  //点转移
					res+=dir[i];
					break;         //一旦找到就退出
				}
			}
		}
	}
	cout<<res<<endl;
	
	return 0;
}

疑惑解答:

为什么要倒搜呢?正搜不可以吗?因为距离数组 d i s dis 在图上呈现的是一个树状。我当时打印出前后的 d i s dis 数组才发现其中的奥妙。
从正搜的 d i s dis 数组可以看出,当我们按照 d i s dis 从起点追述到终点时,我们找下一个点是当下一个点的 d i s dis 值比当前点的 d i s dis 1 1 ,而我们可以看出,有很多分支,就是下一个点的 d i s dis 比当前点的 d i s dis 1 1 这样的点不止一个,这样就会很容易走进死胡同。(或与这样需要回溯
而倒搜就不一样了,从起点出发,直到找到下一个点的 d i s dis 值比当前点小 1 1 就好了,且这样的点只有一个。

正搜的 d i s dis 数组:# 代表墙

  0  #  4  #  #  # 14  # 24 23  # 21  #  # 26 25  # 29 30  # 32  #132  #  #131132  #120  #  #121  #119120  #122123124125  #135134133  #143  #  #  #  #
  1  2  3  4  # 12 13 14  # 22 21 20 21 22  # 24  # 28  # 30 31  #131130129130  #120119118119120119118  #120121  #  #126127  #  #132  #142141  #141  #
  2  #  #  #  # 11  #  # 14  # 20 19  # 21 22 23  # 27 28 29 30 31  #  #128  #122121  #117  #  #  #117118119  #  #128127128129130131132  #140139140141
  3  #  7  8  9 10 11 12 13 14  # 18  # 20  # 24 25 26  #  # 31  #129128127126  #120  #116115114115116  #120  #122  #128  #130  #  #133134  #138  #  #
  4  5  6  #  #  #  #  # 14 15 16 17 18 19  # 25  # 27 28 29 30  #130129  #125  #119118117  #113  #117118119120121  #129  #  #136135134135136137138139
  #  #  7  8  # 34 35 36  #  # 17  # 19  # 27 26 27 28  # 30  # 66  #  #125124123  #  #118  #112111  #  #120  #122  #130  #  #  #  #  #  #137  #  #  #
 10  9  8  #  # 33  #  #  #  # 18  # 20  # 28 27  # 29 30  # 66 65  # 67  #123122121120119120  #110111112  #136  #132131  #  #  #141140139138139140141
  # 10  # 34 33 32 31 30  # 28  # 22 21 22  # 28 29  #  #  #  # 64  # 66  #124  #  #  #  #  #110109  #  #136135134133  #145144143142  #  #  #140  #142
 12 11  #  #  # 31 30 29 28 27  # 23  # 23  # 29 30 31 32  #  # 63 64 65  #125126127128129130  #108107106  #136  #134135  #  #144143144145  #141142  #
  #  # 37 36 35  #  # 30  # 26 25 24 25  #  #  # 31 32  # 62 61 62  # 66 67  #127  #129  #131  #109  #105  #137  #135  #147146145  #  #146  #142143144
 40 39 38  # 34 33 32 31  # 27 26  # 26 27 28 29 30  # 60  # 60 61  # 67  # 67  #  #  #  #  #  #  #105104105  #101  #  #  #147  #149148147148  #144  #
  #  #  # 36 35  # 33 32  # 28  # 28 27  # 29 30  # 58 59 60 59  # 69 68 67 66 65  # 69  # 71  #  #  #103  #101100  #  #  #  #151150149  #149  #145146
 40 39 38 37 36 37  # 31 30 29 30 29 28 29  # 31  # 57  #  # 58 59  #  #  #  # 64  # 68 69 70  #  #103102101100 99  #  #  #  #  #151  #151150151  #  #
  # 40  # 38  # 38  # 32 31  #  #  # 29 30 31 32  # 56 57 56 57  #  # 62 61 62 63  # 67  #  #  #  #  #  #  #  # 98  #  #  #  #153152153152  #152153154
  # 41  # 39  # 37  # 33  # 33 32 31 30  #  # 33  # 55  # 55  # 59 60  # 60  # 64 65 66 67  #  #  # 93 94 95 96 97  #  #  #159  #  #  #153  #153154  #
  # 40 39 38 37 36 35 34  # 34  #  # 31 32 33  # 55 54 53 54  # 58  #  # 59 60  # 64  #  # 95  # 93 92  # 96  #  #  #160159158157156155154155  #155156
  # 41  # 39  # 37 36  # 36 35 34 33 32 33 34  # 56  # 52 53  # 57 56 57 58  # 62 63 64  # 94 93 92 91 92  # 88 89 90  #  #  #  #157  #155  #157156  #
 43 42  # 40  # 38 37  # 37  # 35  # 33  #  # 38  # 52 51  # 53  # 55  # 59 60 61  #  #  #  # 94  # 90  #  # 87  #  #  #161160159158  #  #185  #157  #
  #  # 42 41  # 39  # 39 38 37 36  # 34 35 36 37  #  # 50 51 52 53 54 55  # 59  # 61 62  # 92  # 90 89 88 87 86  #164163162  #  #  #182183184185  #  #
 45 44 43 42  # 40 41 40  #  # 37 36 35 36  #  # 47  # 49  #  # 52  # 56 57 58 59 60 61  # 91 90  # 90  # 86 85  #165164  #182181180181  #  #  #183  #
  # 45  # 43 44  # 42  # 40 39 38  # 36  # 48 47 46 47 48 49 50 51  #  #  # 59  #  # 62 63  # 89  #  #  #  # 84  #  #165  #183  #179  #181180181182  #
 47 46  # 44  # 44 43 42 41  # 39 38 37 38  #  # 45  # 47  # 51  # 55 56 57 58  # 64 63 64  # 88 87 88  # 84 83  #167166167  #179178177  #179  #183  #
  # 47  # 45 46 45 44  # 42 41 40  #  # 39 40  # 44 45 46  # 52 53 54 55  # 59  # 65  # 65 66  # 86  # 84  # 82  #168  #  #  #  #  #176  #178179  #183
 49 48 47 46 47  # 45 46  # 42  # 42 41 40 41 42 43  #  # 54 53  # 55  # 61 60  # 64  # 66 67  # 85 84 83 82 81  #169170171172173174175176177178  #182
  #  # 48  # 48 47 46 45 44 43  # 43 42  #  #  # 44  #  #  # 54 55  # 59 60  # 62 63 64 65  #  #  # 85  # 81 80  #170  #  #173  #  #  #177  #179180181
 51 50 49 50 49  #  # 46  # 44 45 44  # 48 49 50  # 54 55 56  # 56 57 58 59 60 61 62  # 66 67 68 69  #  #  # 79  #171172173174175176  #  #181180  #  #
  # 51  # 51  # 49 48 47  # 45  # 45 46 47  # 51 52 53  # 57 58 57  #  #  #  #  # 63 64 65  # 69  # 75  # 77 78  #172  #174175176177178179  #181182183
  # 52 53 52 51 50  # 48  # 46 47  # 47  # 51 52  # 54  # 58  #  # 61 62 63 64 65 64 65  # 71 70  # 74  # 76  #174173174  #176  #  #  #180  #182183184
 54 53  #  #  #  # 50 49 48 47  # 49 48 49 50  # 56 55 56 57 58 59 60  #  # 65  #  #  # 73 72 71 72 73 74 75 76  #174175176177178179180181  #183  #  #
  # 54 55 54 53 52 51  #  # 48 49  #  #  # 51  # 57  #  #  # 59  # 61 62 63  #  #  #  #  #  # 72  #  #  # 76  #  #  #176  #  #179  #  #  #  #184185186

倒搜的 d i s dis 数组:

186  #  #  #  #  #180  #176175  #173  #  #176175  #177178  #180  # 90  #  # 89 90  # 76  #  # 73  # 71 72  # 64 63 62 61  # 59 58 57  # 57  #  #  #  #
185186187  #  #178179180  #174173172173172  #174  #176  #178179  # 89 88 87 88  # 76 75 74 73 72 71 70  # 66 65  #  # 60 59  #  # 56  # 56 55  # 55  #
184  #  #  #  #177  #  #174  #172171  #171172173  #175176177178179  #  # 86  # 78 77  # 75  #  #  # 69 68 67  #  # 60 59 58 57 56 55 54  # 54 53 54 55
183  #179178177176175174173172  #170  #170  #172173174  #  #177  # 87 86 85 84  # 78  # 74 73 72 71 70  # 68  # 72  # 60  # 58  #  # 53 52  # 52  #  #
182181180  #  #  #  #  #172171170169168169  #171  #173174175176  # 88 87  # 83  # 77 76 75  # 73  # 71 70 69 70 71  # 61  #  # 54 53 52 51 50 51 52 53
  #  #181182  #172173174  #  #171  #167  #171170171172  #176  #152  #  # 83 82 81  #  # 76  # 74 75  #  # 70  # 72  # 62  #  #  #  #  #  # 49  #  #  #
184183182  #  #171  #  #  #  #172  #166  #170169  #173174  #152151  #149  # 81 80 79 78 77 78  # 76 77 78  # 68  # 64 63  #  #  # 45 46 47 48 49 50 51
  #184  #172171170169168  #166  #164165166  #168167  #  #  #  #150  #148  # 82  #  #  #  #  # 78 77  #  # 68 67 66 65  # 47 46 45 44  #  #  # 50  # 52
186185  #  #  #169168167166165  #163  #167  #167166167168  #  #149148147  # 83 84 85 86 87 88  # 78 79 80  # 68  # 66 67  #  # 44 43 42 41  # 51 52  #
  #  #171170169  #  #166  #164163162161  #  #  #165166  #150149150  #146147  # 85  # 87  # 89  # 79  # 81  # 69  # 67  # 47 46 45  #  # 40  # 52 53 54
174173172  #168167166165  #163164  #160161162163164  #148  #148149  #145  #143  #  #  #  #  #  #  # 83 82 83  # 89  #  #  # 47  # 39 40 39 38  # 54  #
  #  #  #168167  #165164  #162  #160159  #163162  #146147148147  #145144143142141  #141  #143  #  #  # 83  # 87 88  #  #  #  # 39 38 39  # 37  # 55 56
170169168167166165  #163162161160159158159  #161  #145  #  #146147  #  #  #  #140  #140141142  #  # 85 84 85 86 87  #  #  #  #  # 37  # 35 36 37  #  #
  #168  #166  #164  #164163  #  #  #157158159160  #144145144145  #  #138137138139  #139  #  #  #  #  #  #  #  # 88  #  #  #  # 37 36 35 34  # 38 39 40
  #167  #165  #163  #165  #159158157156  #  #161  #143  #143  #139140  #136  #138137138139  #  #  # 93 92 91 90 89  #  #  # 33  #  #  # 33  # 39 40  #
  #166165164163162163164  #158  #  #155156157  #143142141142  #138  #  #135136  #136  #  # 99  # 95 94  # 92  #  #  # 34 33 32 31 30 31 32 33  # 41 42
  #167  #163  #161162  #158157156155154155156  #144  #140141  #137136135134  #134135136  # 98 97 96 95 96  #102103104  #  #  #  # 29  # 33  # 43 42  #
169168  #162  #160161  #157  #155  #153  #  #156  #140139  #137  #135  #133132133  #  #  #  # 98  # 96  #  #101  #  #  # 25 26 27 28  #  # 21  # 43  #
  #  #162161  #159  #157156155154  #152153154155  #  #138137136135134133  #131  #129128  #116  # 98 97 98 99100  # 24 23 24  #  #  # 18 19 20 21  #  #
163162161160  #158157158  #  #153152151152  #  #141  #139  #  #136  #132131130129128127  #115114  # 98  #100101  # 23 22  # 18 17 16 17  #  #  # 15  #
  #161  #159160  #156  #154153152  #150  #142141140139138137136137  #  #  #131  #  #126125  #113  #  #  #  #102  #  # 21  # 19  # 15  # 13 12 13 14  #
161160  #158  #156155154153  #151150149148  #  #141  #139  #135  #135134133132  #126125124  #112111112  #104103  # 19 20 21  # 15 14 13  # 11  # 15  #
  #159  #157156155154  #152151152  #  #147146  #142141140  #134135136135  #131  #125  #123124  #110  #108  #104  # 18  #  #  #  #  # 12  # 10  9  # 11
159158157156155  #153152  #150  #148147146145144143  #  #134133  #137  #129130  #124  #122123  #109108107106105  # 17 16 15 14 13 12 11 10  9  8  # 10
  #  #158  #154153152151150149  #147148  #  #  #144  #  #  #132131  #129128  #124123122121  #  #  #109  #107106  # 18  #  # 15  #  #  # 11  #  7  8  9
159158157156155  #  #152  #148147146  #142141140  #136135134  #130129128127126125124  #120119118119  #  #  #107  # 19 18 17 16 17 18  #  #  7  6  #  #
  #159  #157  #155154153  #149  #145144143  #139138137  #133132131  #  #  #  #  #123122121  #117  #115  #109108  # 20  # 18 17 18 19 20 21  #  5  6  7
  #160159158157156  #154  #150151  #145  #141140  #136  #134  #  #129128127126125124123  #117116  #114  #110  # 22 21 22  # 18  #  #  # 22  #  4  5  6
162161  #  #  #  #154153152151  #145144143142  #136135134133132131130  #  #127  #  #  #117116115114113112111112  # 22 21 20 19 20 21 22 23  #  3  #  #
  #160159158157156155  #  #152153  #  #  #143  #137  #  #  #133  #131132133  #  #  #  #  #  #116  #  #  #112  #  #  # 22  #  # 21  #  #  #  #  2  1  0

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/88802203
今日推荐