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

地下城主

思路:这个其实就是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;
}

相关推荐

  1. 174. 地下游戏

    2024-03-18 21:10:02       39 阅读
  2. leetcode 174.地下游戏

    2024-03-18 21:10:02       38 阅读
  3. LeetCode 174.地下游戏 Python题解

    2024-03-18 21:10:02       42 阅读
  4. 寒假每日练习——搜索

    2024-03-18 21:10:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-18 21:10:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-18 21:10:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-18 21:10:02       87 阅读
  4. Python语言-面向对象

    2024-03-18 21:10:02       96 阅读

热门阅读

  1. 【基础】连续数的和 c++

    2024-03-18 21:10:02       38 阅读
  2. android 事件分发笔记

    2024-03-18 21:10:02       41 阅读
  3. Milvus部分源码阅读

    2024-03-18 21:10:02       36 阅读
  4. c++野指针如何处理?

    2024-03-18 21:10:02       43 阅读
  5. 代码随想录阅读笔记-哈希表【四数之和】

    2024-03-18 21:10:02       45 阅读
  6. SQL中的SYSDATE函数

    2024-03-18 21:10:02       42 阅读
  7. python之SimpleNamespace()使用总结

    2024-03-18 21:10:02       42 阅读
  8. leetcode 第126场双周赛第二题

    2024-03-18 21:10:02       40 阅读
  9. Python教程:一文了解Python的异常处理知识

    2024-03-18 21:10:02       40 阅读