- 浏览: 202425 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (137)
- c++ (74)
- c++,算法,回溯 (2)
- DP问题。 (9)
- DP问题,0/1背包问题 (3)
- 数学问题 (6)
- 贪心算法 (10)
- 排序 (16)
- 数据结构 (7)
- 容器 (2)
- 模拟问题 (2)
- 水题 (8)
- 并查集 (3)
- 非技术 (2)
- 素数问题 (1)
- DFS (3)
- 二叉树 (1)
- 递归 (1)
- 图论 (5)
- 最小生成树 (5)
- 最短路径 (6)
- bell_flaod算法 (2)
- hash (3)
- 二分查找 (1)
- 搜索 (5)
- BFS (5)
- STL (3)
- 字符串hash (1)
- 拓扑排序 (1)
- 字典树 (4)
- 哈弗曼树 (1)
- KMP (7)
- 线段树 (9)
- 树状数组 (6)
- 全排列 (2)
- DP问题 (2)
- LCS (1)
- 最长不下降子序列 (2)
- 面试经验 (3)
与树的遍历相同,图遍历操作的定义式访问图中每一个结点且每个结点只被访问一次。图的遍历方法主要有两种:一种是深度优先的(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;
}
发表评论
-
虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
2013-08-29 14:34 840虚函数:虚函数是C++中用于实现多态(polymorphis ... -
排序算法总结
2013-05-17 11:00 842选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, ... -
poj 3122
2012-12-11 19:51 870题意:作者要开一个生日party,他现在拥有n块高度都为1 ... -
poj 3273
2012-12-11 16:49 985题意:给你天数n,和每天需要花的钱,让你把这些天分成m份(每份 ... -
字典树学习材料
2012-05-30 14:29 970字典树,又称单词查找树,Trie树,是一种树形结构,典型应 ... -
poj 1159
2012-05-28 19:08 1445题目大意:给你一段字符串,让你求出在中间最少加入几个字符 ... -
poj 3176
2012-05-28 14:47 1018大致题意: 输入一个n层的三角形,第i层有i个数,求从第 ... -
poj 1260
2012-05-28 09:54 1614题意解释: 有n个等级的珠宝,等级依次升高,等级越高价钱越高 ... -
poj 1836
2012-05-28 09:22 2714是POJ2533的扩展题。题意不难,令到原队列 ... -
poj 2533
2012-05-26 15:36 1274在做这道题目之前,首先让我们了解一下什么是LIS算法,LIS俗 ... -
poj 3267
2012-05-26 09:43 803从程序可以看出,第i个位置到L所删除的字符数,总是先取最坏情况 ... -
poj 1276
2012-05-25 16:20 2396题意: 这道题的意思是给你一堆钱,各种面值的都有,比 ... -
poj 1094
2012-05-25 13:54 1107题意:给出字母个数,和有限个有序对(a<b)求出能确定字 ... -
poj 3393
2012-05-23 17:00 1259大致题意: 科普文一篇,文章80%都是无用信息,因为 ... -
poj 3007
2012-05-14 10:21 994大致题意: 给定一个字符串,从任意位置把它切为两半, ... -
poj 3096
2012-05-10 21:09 1011题意: 定义D-pairs表示取字符串s中相距为D的两个字母 ... -
poj 1426
2012-04-26 20:11 2171大致题意: 给出一个整数n,(1 <= n <= ... -
poj 1797
2012-04-24 15:05 1626题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载 ... -
poj 1338
2012-04-23 10:20 1259题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1 ... -
poj 2021
2012-04-19 15:00 950题意:Ted今年100岁,给出n对他家族的关系:“父 ...
相关推荐
"禁忌搜索背包问题"是指利用禁忌搜索算法来寻找背包问题的最优解。在这个问题中,我们有一个固定容量的背包,以及一系列物品,每件物品都有其体积(或重量)和价值。目标是选择物品,使得放入背包的总价值最大,但不...
《人工智能之搜索,问题搜索》 在人工智能领域,搜索是一种核心的解决问题的策略,它涉及到对问题空间的探索,以找到最优或可行的解决方案。本文将深入探讨搜索方法及其在模糊搜索中的应用。 首先,我们要理解问题...
本主题将深入探讨“2.7对称搜索问题”,这是一种利用分治法(Divide and Conquer)策略来解决的问题。分治法是一种高效的问题求解方法,它将大问题分解为小问题,然后分别解决,最后将结果合并。 对称搜索问题通常...
### 信息学竞赛中关于部分搜索算法的问题 #### 深度优先搜索的非常规搜索:部分搜索+高效搜索! **一、引言** 在信息学竞赛中,尤其是在解决复杂问题时,传统的搜索方法往往难以满足高效求解的需求。面对这类问题...
使用C语言编写程序,解决迷宫搜索问题。本实验是基于启发式搜索算法,快速找到迷宫的出口,通过演示,可以清楚地展示基于状态空间搜索算法的工作流程,同时提供自动寻找路径的功能。
①使用深度优先搜索来解决八数码问题 ②使用广度优先搜索来解决八数码问题 ③使用过程式表示和实现八数码问题 以及相关代码详细注释 过程式知识表示是将有关某一问题领域的知识, 连同如何使用这些知识的方法,均...
在这个问题中,我们用不同的搜索算法来寻找所有可能的解决方案。下面我们将深入探讨广度优先搜索(BFS)和全局择优算法在解决这个问题中的应用。 首先,广度优先搜索是一种用于遍历或搜索树或图的算法。在九宫重排...
暴力搜索,又称全搜索或遍历搜索,是一种在解决问题时,通过尝试所有可能的解决方案来找到最优解的算法。在优化问题中,暴力搜索扮演着重要角色,尤其当其他更高效的算法难以应用或者未知的情况下。这种方法简单直接...
盲目搜索(广度搜索)解重排九宫问题,即把数码问题的盲目搜索求解!C++实现的。
"人工智能导论:搜索问题" 本节内容主要讨论人工智能领域中的搜索问题,包括状态空间的搜索、搜索方式、关键问题等。 状态空间的搜索 状态空间的搜索是人工智能中的一种重要问题,旨在找到从初始状态到目标状态的...
"禁忌搜索背包问题"是指利用禁忌搜索算法来解决背包问题的一种方法。禁忌搜索算法是一种全局优化技术,适用于处理多模态函数和复杂优化问题。在这个场景中,我们的目标是最大化背包内物品的总价值,同时不超过背包的...
总结,Python提供了强大的工具和库,使我们能够轻松地实现和可视化八数码问题的各种搜索策略。通过理解这些算法的工作原理并结合实际编程实践,我们可以深入学习到搜索算法的精髓,这对于解决更复杂的问题和提升编程...
在这个问题中,有序搜索算法是一种有效的解决策略,特别是与Java编程语言相结合。下面我们将详细探讨有序搜索算法以及如何在Java中实现它。 有序搜索,又称为二分查找或折半查找,是一种在有序数组中寻找特定元素的...
"用C语言实现八数码问题的宽度优先搜索" 在计算机科学中,八数码问题是一个经典的搜索问题。它是指在一个3x3的棋盘上,编号从0到8的数字被随机排列,需要通过移动空格(编号为0)来达到一个目标状态。宽度优先搜索...
分油问题是一个经典的计算机科学问题,它涉及到搜索算法的应用,特别是在优化问题的求解中。在本场景下,我们主要探讨的是如何通过搜索算法来解决这类问题。 分油问题的基本设定是这样的:假设你有一批不同容量的...
"图搜索问题求解旅行商问题" 在计算机科学和人工智能领域中,图搜索问题是指在图结构中寻找从起点到终点的路径问题。状态图是图搜索问题的数学模型,用于描述图结构的状态和转换规则。旅行商问题是图搜索问题的一种...
在这个问题中,我们可以应用几种不同的搜索算法来寻找最优路径,包括深度优先搜索(DFS)、迭代加深的搜索(IDS)、A*搜索以及一致代价搜索(UCS)。 1. 深度优先搜索(DFS): DFS是一种盲目搜索策略,它沿着树或...
《MATLAB实现大规模邻域搜索算法解决旅行商问题详解》 旅行商问题(Traveling Salesman Problem, TSP)是图论中一个经典的组合优化问题,它的目标是找到访问每座城市一次并返回起点的最短路径。在实际应用中,如...
在这个场景中,我们将探讨局部搜索、遗传算法和模拟退火算法这三种方法,以及它们在解决TSP问题中的应用。 1. 局部搜索算法: 局部搜索是一种基于当前解进行迭代改进的方法,通过改变解的某些部分来尝试找到更好的...
【禁忌搜索算法】是一种在复杂优化问题中广泛应用的全局优化算法,它的主要思想是通过避免在搜索过程中重复已经访问过的解(禁忌),来探索问题的解空间,从而找到全局最优解或接近最优解的解决方案。在车辆调度问题...