经典算法:dfs暴搜,剪枝

简介: 经典算法:dfs暴搜,剪枝

想要坚持写点什么,那干脆写一个系列吧。想想有什么可以写的呢?程序=算法+数据结构,可见算法的重要性。这个系列老诗力求用最简单的语言把算法讲得明明白白,由浅到深,有兴趣的话,可以关注一下专栏。

上一篇文章介绍了基础的回溯法,剪枝。然后用全排列做了例子。接下来更加深入地去研究,这种算法应该怎么去深入。记得上一篇文章我还特意留下了作业让大家有兴趣的话一定要去做一做,因为挺经典的。

标题:五星填数

如图的五星图案节点填上数字:1~12,除去7和11。要求每条直线上数字和相等。

如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。

image.png

这道题目需要去重,因为是五角星 5(因为每个角是可以旋转的,所以这些都是可以认定是相同的),且镜像 2,所以暴搜之后直接/10就是去重之后的数量。

然后我们再把重点放在暴搜上面。

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[11];      //五角星的数 
int n;          //记录成立个数
int isUse[110];   //记录这些数是否用过
void dfs(int s){
    if(s==11){
        int f = a[2] + a[3] + a[4] + a[5];
        int b  = a[1] + a[3] + a[6] + a[9];
        int c  = a[1] + a[4] + a[7] + a[10];
        int d  = a[2] + a[6] + a[8] + a[10];
        int e  = a[5] + a[7] + a[8] + a[9];
        if(f==b && b==c && c==d && d==e){
            n++;
            return ;
        }
        return ;
    }
    for(int i=1;i<=12;i++){
        if(i==7||i==11||isUse[i]){
            continue;
        }
        isUse[i] = 1;
        a[s] = i;
        dfs(s+1);
        isUse[i] = 0;
    }
    return ;
}
int main()
{
    dfs(1); 
    cout<<n/10; //5*2
    return 0;
}

总的来说整到题目如果知道算法的话并不是太难,也就是直接套入模板就行了。dfs中填入每一个数,也就是和全排列差不多,然后这里加上剪枝数字不能等于7和11,还是数字不能被用过。用isUse记录数字是否被用过。isUse[i] = 1;标记为用过dfs完了之后需要标记为isUse[i] = 0;也就是没用过,这就是回溯法的特色。

其实这种回溯可以用到很多地方,例如寻路算法,也就是在试一试哪个方向格子可以更好走而已。

更多的干货内容,项目源码,可以关注公众号:诗一样的代码

相关文章
|
2月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
33 4
|
2月前
|
算法
数据结构与算法-DFS+BFS篇(迷宫问题)
数据结构与算法-DFS+BFS篇(迷宫问题)
29 3
|
2月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
2月前
|
算法 Java
Java数据结构与算法:图算法之深度优先搜索(DFS)
Java数据结构与算法:图算法之深度优先搜索(DFS)
|
2月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
2月前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
3月前
|
机器学习/深度学习 算法 图形学
告别3D高斯Splatting算法,带神经补偿的频谱剪枝高斯场SUNDAE开源了
【5月更文挑战第26天】SUNDAE,一种结合频谱剪枝和神经补偿的高斯场方法,已开源,解决了3D高斯Splatting的内存消耗问题。SUNDAE通过建模基元间关系并剪枝不必要的元素,降低内存使用,同时用神经网络补偿质量损失。在Mip-NeRF360数据集上,SUNDAE实现26.80 PSNR和145 FPS,内存仅为104MB,优于传统算法。然而,其计算复杂性、参数优化及对其他3D表示方法的适用性仍有待改进。代码开源,期待进一步研究。[论文链接](https://arxiv.org/abs/2405.00676)
33 2
|
2月前
|
人工智能 算法 Java
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
|
2月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏

热门文章

最新文章