`

关于搜索的问题。

阅读更多

    与树的遍历相同,图遍历操作的定义式访问图中每一个结点且每个结点只被访问一次。图的遍历方法主要有两种:一种是深度优先的(DFS),另一种是广度优先的(BFS)。

   图的遍历算法设计要考虑到三个问题:(1)图的特点是没有首尾之分,所以算法的参数要指定访问的第一个结点;(2)对图的遍历路径有可能是一个回路,从而造成死循环,所以算法设计要考虑到遍历路径可能出现的死循环问题;(3)一个结点可能与若干个结点都是邻接连点,要使一个结点的所有邻接结点按照某种次序被访问。

   DFS(图的深度优先算法)是遍历时深度优先的算法,即在图的所有邻接结点中每次都在访问完成当前结点后首先访问当前结点的第一个邻接结点,这是一个递归算法。

  连通图的深度优先算法为:

a、访问结点v并标记结点v为访问;

b、查找结点v的第一个邻接结点w;

c、若结点v的邻接结点w存在,则继续执行,否则算法结束;

d、若结点w尚未被访问,则递归访问结点w;

e、查找结点v的w邻接结点的下一个邻接结点w,转到步骤c;

  BFS(图的广度优先遍历算法)是一个分层搜索的过程,图的广度搜索算法需要一个队列以保持访问过的结点顺序,以便按顺序访问这些结点的邻接结点。连通图的广度优先算法为:

(1)访问初始结点v并标记结点v为已访问;

(2)结点v入队列;

(3)当队列非空时则继续进行,否则算法结束;

(4)出队列取的头结点u;

(5)查找结点u的第一个邻接结点w;

(6)若结点u的邻接结点w不存在,则转到步骤(3),否则循环执行以下步骤;

   (6.1)若结点w尚未被访问,则访问w并标记w为已访问;

   (6.2)结点w入队列;

   (6.3)查找结点u的w邻接结点的下一个邻接结点,转到步骤(6);

 

 

poj  3278就是一个典型的广度优先搜索问题:

题意如下:就是给出a和b点的横坐标,求到a,b的最小行动次数,其中每次行动只能是下面两种情况之一

  (1)向左或向右移动一步,即横坐标加1或者减1 ;

  (2)横坐标变成原来的两倍;

  题目给出的数据5 17 , 可以这样进行行动 5 -> 10 -> 9 -> 18 -> 17 所以只需要四步就可以到达b。

 

 

  因为是求最小行动次数,故可以用BFS,调用STL里面的队列来实现。每次去队首元素,如果到达了b点,输出步子并结束搜索,否则,行动步子+1,并分别将改点的横坐标+1,-1,×2操作后压入队列,一直到寻找到解。注意到当位置的横坐标超过了b点就应该再向右走,故此时应该对其横坐标只有-1操作,还要注意到横坐标为0的特殊情况,此处应该只进行+1行走。刚开始的时候把标记数组开小了,没注意到×2可能会出现超过100,000的情况,提交时RE了一次,把数组改打就AC了。

代码如下:

#include <iostream>
#include <queue>
using namespace std;
const int  Max=100005;

int main()
{
	queue<int> a;
	int n,k;
	cin>>n>>k;
	bool visit[Max];//标记是否访问过
	memset(visit,false,sizeof(visit));
	bool fine=false;
	int step=0;//结果次数
	visit[n]=true;
	a.push(n);
	if (n!=k)
	{
		while (!a.empty()&&!fine)
		{
			int t=a.size();
			step++;
			while (t--)
			{
				int pos,npos[3];
				pos=a.front();
				a.pop();
				npos[0]=pos+1;
				npos[1]=pos-1;
				npos[2]=pos*2;//三种情况
				for (int i=0;i<3;i++)
				{
					if (npos[i]==k)
					{
						fine=true;
						break;
					}
					if (npos[i]>=0&&npos[i]<=10000&&!visit[npos[i]])
					{
						visit[npos[i]]=true;
						a.push(npos[i]);//将位置入队列
					}
				}

			}
		}
	}
	cout<<step<<endl;
	return 0;
}

 

 

 关于搜索的题目还会继续……
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    禁忌搜索背包问题,禁忌搜索算法解决背包问题,matlab

    "禁忌搜索背包问题"是指利用禁忌搜索算法来寻找背包问题的最优解。在这个问题中,我们有一个固定容量的背包,以及一系列物品,每件物品都有其体积(或重量)和价值。目标是选择物品,使得放入背包的总价值最大,但不...

    人工智能之搜索,问题搜索

    《人工智能之搜索,问题搜索》 在人工智能领域,搜索是一种核心的解决问题的策略,它涉及到对问题空间的探索,以找到最优或可行的解决方案。本文将深入探讨搜索方法及其在模糊搜索中的应用。 首先,我们要理解问题...

    算法分析 2.7对称搜索问题

    本主题将深入探讨“2.7对称搜索问题”,这是一种利用分治法(Divide and Conquer)策略来解决的问题。分治法是一种高效的问题求解方法,它将大问题分解为小问题,然后分别解决,最后将结果合并。 对称搜索问题通常...

    信息学竞赛中关于部分搜索算法的问题

    ### 信息学竞赛中关于部分搜索算法的问题 #### 深度优先搜索的非常规搜索:部分搜索+高效搜索! **一、引言** 在信息学竞赛中,尤其是在解决复杂问题时,传统的搜索方法往往难以满足高效求解的需求。面对这类问题...

    迷宫搜索问题-利用启发式搜索 c++

    使用C语言编写程序,解决迷宫搜索问题。本实验是基于启发式搜索算法,快速找到迷宫的出口,通过演示,可以清楚地展示基于状态空间搜索算法的工作流程,同时提供自动寻找路径的功能。

    C语言实现:八数码问题的深度优先搜索、广度优先搜索、过程表示(全)

    ①使用深度优先搜索来解决八数码问题 ②使用广度优先搜索来解决八数码问题 ③使用过程式表示和实现八数码问题 以及相关代码详细注释 过程式知识表示是将有关某一问题领域的知识, 连同如何使用这些知识的方法,均...

    搜索算法解决九宫重排问题

    在这个问题中,我们用不同的搜索算法来寻找所有可能的解决方案。下面我们将深入探讨广度优先搜索(BFS)和全局择优算法在解决这个问题中的应用。 首先,广度优先搜索是一种用于遍历或搜索树或图的算法。在九宫重排...

    暴力搜索(优化问题).rar_优化问题_暴力搜索_暴力搜索解决优化问题_遍历搜索_遍历搜索优化

    暴力搜索,又称全搜索或遍历搜索,是一种在解决问题时,通过尝试所有可能的解决方案来找到最优解的算法。在优化问题中,暴力搜索扮演着重要角色,尤其当其他更高效的算法难以应用或者未知的情况下。这种方法简单直接...

    盲目搜索(广度搜索)解重排九宫问题(C++)

    盲目搜索(广度搜索)解重排九宫问题,即把数码问题的盲目搜索求解!C++实现的。

    人工智能导论:第一章 搜索问题

    "人工智能导论:搜索问题" 本节内容主要讨论人工智能领域中的搜索问题,包括状态空间的搜索、搜索方式、关键问题等。 状态空间的搜索 状态空间的搜索是人工智能中的一种重要问题,旨在找到从初始状态到目标状态的...

    禁忌搜索背包问题_禁忌搜索背包_禁忌搜索_禁忌搜索算法

    "禁忌搜索背包问题"是指利用禁忌搜索算法来解决背包问题的一种方法。禁忌搜索算法是一种全局优化技术,适用于处理多模态函数和复杂优化问题。在这个场景中,我们的目标是最大化背包内物品的总价值,同时不超过背包的...

    python深度,广度,三种启发式搜索解决八数码问题

    总结,Python提供了强大的工具和库,使我们能够轻松地实现和可视化八数码问题的各种搜索策略。通过理解这些算法的工作原理并结合实际编程实践,我们可以深入学习到搜索算法的精髓,这对于解决更复杂的问题和提升编程...

    十五数码问题(利用有序搜索算法)

    在这个问题中,有序搜索算法是一种有效的解决策略,特别是与Java编程语言相结合。下面我们将详细探讨有序搜索算法以及如何在Java中实现它。 有序搜索,又称为二分查找或折半查找,是一种在有序数组中寻找特定元素的...

    用C语言实现八数码问题的宽度优先搜索

    "用C语言实现八数码问题的宽度优先搜索" 在计算机科学中,八数码问题是一个经典的搜索问题。它是指在一个3x3的棋盘上,编号从0到8的数字被随机排列,需要通过移动空格(编号为0)来达到一个目标状态。宽度优先搜索...

    分油问题 搜索算法 分油问题 搜索算法

    分油问题是一个经典的计算机科学问题,它涉及到搜索算法的应用,特别是在优化问题的求解中。在本场景下,我们主要探讨的是如何通过搜索算法来解决这类问题。 分油问题的基本设定是这样的:假设你有一批不同容量的...

    图搜索问题求解旅行商问题

    "图搜索问题求解旅行商问题" 在计算机科学和人工智能领域中,图搜索问题是指在图结构中寻找从起点到终点的路径问题。状态图是图搜索问题的数学模型,用于描述图结构的状态和转换规则。旅行商问题是图搜索问题的一种...

    罗马尼亚问题,从Arad到Bucharest结果,深度优先搜索(DFS);迭代加深的搜索(IDS);A*搜索;一致代价搜索(UCS);

    在这个问题中,我们可以应用几种不同的搜索算法来寻找最优路径,包括深度优先搜索(DFS)、迭代加深的搜索(IDS)、A*搜索以及一致代价搜索(UCS)。 1. 深度优先搜索(DFS): DFS是一种盲目搜索策略,它沿着树或...

    matlab大规模邻域搜索算法求解旅行商问题.zip

    《MATLAB实现大规模邻域搜索算法解决旅行商问题详解》 旅行商问题(Traveling Salesman Problem, TSP)是图论中一个经典的组合优化问题,它的目标是找到访问每座城市一次并返回起点的最短路径。在实际应用中,如...

    使用局部搜索,遗传算法,退火算法解决TSP问题(代码加文档)

    在这个场景中,我们将探讨局部搜索、遗传算法和模拟退火算法这三种方法,以及它们在解决TSP问题中的应用。 1. 局部搜索算法: 局部搜索是一种基于当前解进行迭代改进的方法,通过改变解的某些部分来尝试找到更好的...

    禁忌搜索算法的车辆调度问题代码

    【禁忌搜索算法】是一种在复杂优化问题中广泛应用的全局优化算法,它的主要思想是通过避免在搜索过程中重复已经访问过的解(禁忌),来探索问题的解空间,从而找到全局最优解或接近最优解的解决方案。在车辆调度问题...

Global site tag (gtag.js) - Google Analytics