0
点赞
收藏
分享

微信扫一扫

蓝桥打卡——day04

今天你读书了吗 2022-03-12 阅读 32

目录

迷宫

💒题目描述

迷宫
原题传送门

🌟解题报告

BFS是有算法模板的,我这里就不在赘述啦,我以前写过BFS的相关的文章,只是质量我感觉很粗糙,假如不嫌弃的话,可以看一下呀~,也可以搜一下其他博主的


层层推进的BFS


1、填空题的输入方式

我不一定就要老老实实的用键盘输入。我可以直接把题目给的数据,直接将它们存放在一个变量中。比如这里的地图,我就直接可以存到一个字符串中
2、记录一下用结构体存储数据的方式。

一般我对于坐标这种成对出现的数据,都是利用pair来进行存储的,今天拜读了小伙伴们的题解,看到用我不太熟悉的结构体进行的存储,因此特意想着重练习一下
3、关于01矩阵的路径输出。

常规来说,记录怎么转移的,然后回溯输出,之前也见过倒着输出的
我之前也是老老实实的走回溯的道路,只是因为我图论的题还练习得太少,没有捋不清析到底应该怎么回溯,怎么转移。
因为这道习题让咱们输出的是字符串。这个时候,其实可以考虑就使用我们可爱的字符串来进行存储的。成功探索到一个可行的位置时,就把它接到已经确定好的路线字符串上

这里粘贴部分代码意会一下,具体的可以看参考代码中的详细注释。

char ways[] = {'D','L','R','U'};

/*********************************************/
struct node{
int x,y;//记录坐标
string way;//记录转移的路径
/*********************************************
/

//将现有结果拼接上去
tt.way= t.way + ways[i];

4、字典序

题目中提到字典序的时候其实不用特别在意的,我们遍历的时候,保证做到都是从小到大进行,那么就妥妥的是字典序了。

比如这个题中提前对上下左右四种转移方式,就可以先提前按照ASCII码从小到大确定一个顺序。
当在进行BFS的时候,对四个方向进行枚举时依旧是从小到大,那么得到的结果,一定是最小的,按照字典序排序的。
5、偏移量

偏移量是老生畅谈了。
可以使用泡泡他们常用的这种二维数组的
	//这里是表示
	int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};

	//这里是枚举四个方向进行运用
	for(int i=0;i<4;i++){
            node next;
            next.x = now.x+dir[i][0];
            next.y = now.y+dir[i][1];

也可以用我这种,本质都是一样的,看那个顺手吧

	//这里是表示
int dx[] = {1,0,0,-1},dy[] = {0,-1,1,0};

//这里是枚举四个方向进行运用
for(int i = 0; i < 4;i++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];


其他的,也没有重要的要提的了吧,本质还是宽搜框架,我这里只是换了一种记录路径的方式嗷~
框框

🌻参考代码(C++版本)

#include <iostream>
#include <cstdio>
#include <queue>
#include <string>

using namespace std;

const int N = 30;
const int M = 50;

//记录这种输入的方式,因为自己下午和输入方式抬杠,白给了好多时间,真是个大聪明
string g[30];
string str=
"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"
;

int dx[] = {1,0,0,-1},dy[] = {0,-1,1,0};
char ways[] = {'D','L','R','U'};
int vis[N][M];

struct node{
int x,y;//记录坐标
string way;//记录转移的路径

node(int a,int b)
{
x = a;
y = b;
}
};

//完善可爱的宽搜函数
void bfs()
{
//先获取地图数据。进行30次行的循环,没行取50列的数据
for(int i = 0,j=0; i < 30;i++)
{
g[i] = str.substr(j,50);
j += 50;
}

//宽搜依赖的队列
queue<node> q;

node ans(0,0);
ans.way = "";//待会用于记录答案路径的字符串

//标记(0,0)已经探索过了
vis[0][0] = 1;
//入队
q.push(ans);


//当队列不空的时候,进行下面的操作
while(q.size())
{
node t = q.front();//取队头
q.pop();//队头出队

//判断是否到达地图的边界
if(t.x == N-1 = M-1)
{
//如果到达了,输出记录路径的字符串
cout << t.way << endl;
break;
}

//探索四个方向
for(int i = 0; i < 4;i++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];

//判断当前这个坐标,是否合法
if(x >= 0 && x < N 0 && y < M)
{
if(g[x][y] == '0' && !vis[x][y])
{
node tt(x,y);
tt.way= t.way + ways[i];//即,当前这位置,是可以探索的,也是字典序最小的,接在已经有的字符串后面,记录路径
q.push(tt);//新的坐标入队
vis[x][y] = 1;//标记dx,dy这个点探索过 了
}
}
}
}
}


int main()
{
bfs();
return 0;
}

只是对于这个题,可以这种取巧吧。自己练的题好少,写起来就好痛苦嗷~~~
在这里插入图片描述

举报

相关推荐

打卡day04

JS学习打卡Day04

Day04

day04

day04作业

Javase day04

0 条评论