搜索练习(地下城主,查找倍数)

2024-03-18 20:52

本文主要是介绍搜索练习(地下城主,查找倍数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地下城主

思路:这个其实就是bfs的板子,但是和以往的bfs不同,这个bfs适用于三维空间,也就是说多出一维需要进行搜索:

犯下的错误:在bfs的输出中我写成了cout<<q[tail].step+1<<endl;
由于在之前我就已经将step加过1了,所以输出这个tail所指向的队列还没有装入值(所以里面装的是脏数据),所以就会导致出错,应该是输出q[tail-1].step即可

收获到的东西:1.这毫无疑问是对我bfs的一次复习,bfs的具体步骤我都已经忘得差不多了 。
2.对于三维的方向数组我也有了了解,在之前二维图中方向数组是互补的,在三维数组中也是互补的。

代码如下:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<cstdio>
#include<cstring>
#define Size 35
using namespace std;
char maze[Size][Size][Size];
bool vis[Size][Size][Size];
int dx[] = { 1,-1,0,0,0,0 };
int dy[] = { 0,0,1,-1,0,0 };
int dz[] = { 0,0,0,0,1,-1 };
int in_x, in_y, in_z;
int out_x, out_y, out_z;
int l, r, c;
typedef struct
{int x, y, z;int step;
}point;
void bfs()
{memset(vis, 0, sizeof(vis));int head = 1;int tail = 1;point q[Size * Size * Size];q[tail].x = in_x;q[tail].y = in_y;q[tail].z = in_z;q[tail].step = 0;vis[in_z][in_x][in_y] = true;tail++;while (head < tail){for (int i = 0; i < 6; i++){int tx = q[head].x + dx[i];int ty = q[head].y + dy[i];int tz = q[head].z + dz[i];if (vis[tz][tx][ty] || tz > l || tz<1 || tx>r || tx < 1 || ty<1 || ty>c)continue;if (maze[tz][tx][ty] != '#'){vis[tz][tx][ty] = true;q[tail].x = tx;q[tail].y = ty;q[tail].z = tz;q[tail].step = q[head].step + 1;tail++;}if (tx == out_x && ty == out_y && tz == out_z){printf("Escaped in %d minute(s).\n", q[tail-1].step );return;}}head++;}cout << "Trapped!" << endl;return;
}
int main()
{while (true){cin >> l >> r >> c;if (l == 0 && r == 0 && c == 0)return 0;for (int i = 1; i <= l; i++){for (int j = 1; j <= r; j++){for (int k = 1; k <= c; k++){cin>>maze[i][j][k];if (maze[i][j][k] == 'S'){in_z = i;in_x = j;in_y = k;}if (maze[i][j][k] == 'E'){out_z = i;out_x = j;out_y = k;}}}getchar();}bfs();}return 0;
}

查找倍数

思路1bfs(时间会爆):主要思路就是第一个插入队列的数是1,然后又两种情况第一后面直接乘以10,第二种情况就是乘以10之后然后再加1。这样就将只有两种1或0的i情况全部把包括进去了(只有取或者不取这两种情况)
思路2dfs:其实和第一种思路差不多,主要就是将插入改成了dfs中的递归,主要还是要考虑一种特殊情况:当递归深度为19的时候就需要停止递归,由于这个数最大不会超过100,而每次递归最少都会增加10倍,所以当我们递归到19的时候就需要停止递归了。

收获到的东西:在之前我都是只靠数组按位进行树的相加,现在我知道了可以通过队列或者递归进行树的相加(当然也与这题的特殊性有关,毕竟只有0和1)

代码如下:

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string.h>
#include<queue>
using namespace std;
typedef long long ll;
int flag = 0;	
ll x;
void dfs(ll step,ll n)
{if(flag||step>=19){return ;}if(n%x == 0){cout << n <<endl;flag = 1;return ;}dfs(step+1,n*10);dfs(step+1,n*10+1);
}
int main()
{while(scanf("%lld",&x)!=EOF){if(x == 0){break;}flag = 0;dfs(0,1);}return 0;
}

这篇关于搜索练习(地下城主,查找倍数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823619

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大