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

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

相关文章

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 ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd