算法初级之穷竭搜索

算法初级之穷竭搜索


穷竭搜索:将所有可能性罗列出来,在其中总能找到一个答案。
1.1递归
n!=n*(n-1)!
1.2 栈 后进先出
1.3 队列 先进先出
1.4 深度优先搜索DFS:
从某个状态开始,不断转移状态直到无法转移后回退一步,继续转移到其他状态,不断重复,知道找到最终解。(eg:解数独)
递归:问:给定整数a1、a2、…、an,判断是否可以从中选出若干数,使它们的和恰好为k。限制条件:-1≤n≤20 -10°≤a≤10 -108≤k≤108
思路:从a开始按顺序决定每个数加或不加,在全部个数都决定后再判断它们的和是不是k即可。因为状态数是2,所以复杂度是O(2)。

int a[MAX N]
int n, k:
已经从前i项得到了和sum,然后对于i项之后的进行分支
bool dfs(int i, int sum)(
/如果前n项都计算过了,则返回sum是否与k相等
f(i ==n) return sum==ki;
/不加上ai]的情况
if(dfs(i + 1, sum)) return true;
//加上a[i]的情况
if (dfs(i+1, sum +a[i])) return true;
//无论是否加上a[i]都不能凑成k就返回 false
return false;
void solve(
if (dfs(0, 0))printf("Yes\n");
else printf("No\n");

1.6 宽度优先搜索(BFS)
它与深度优先搜索类似,从某个状态出发探索所有可以到达的状态。
与深度优先搜索的不同之处在于搜索的顺序,宽度优先搜索总是先搜索距离初始状态近的状态。因此复杂度为O(状态数×转移的方式)。

**typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
**pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。

例题:迷宫的最短路径
给定一个大小为N×M的述宫。述宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。
限制条:N,M≤100
在这里插入图片描述
思路:宽度优先搜索中,只要将已经访问过的状态用标记管理起来,就可以很好地做到由近及远的搜索。这个问题中由于要求最短距离,不妨用aN[Mn数组把最短距离保存起来。初始时用充分大的常数INF来初始化它,这样尚未到达的位置就是NF,也就同时起到了标记的作用。
虽然到达终点时就会停止搜索,可如果继续下去直到队列为空的话,就可以计算出到各个位置的最短距离。此外,如果搜索到最后,d依然为INF的话,便可得知这个位置就是无法从起点到达的位置。
因为要向4个不同方向移动,用ax[41和ayt41两个数组来表示四个方向向量。这样通过一个循环就可以实现四方向移动的遍历
在这里插入图片描述在这里插入图片描述

1.7 剪枝
由于穷竭搜索会将所有可能解都检查一遍,当姐空间非常大时候,复杂度也会相对应提高,股深度优先搜索时,有时早已明确从当前状态怎么转移都不存在解,这时候不再搜索,而是直接跳过。此方法称为剪枝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值