五星填数与深度优先搜索回溯思想
来源:互联网 发布:淘宝外国模特 编辑:程序博客网 时间:2024/05/16 14:43
在五星图案节点填上数字:1-12,除去1和11.要求每条直线上数字和相等。那么所有可能的填法一共几种?(旋转或镜像后相同的算一种算法)下图就是适当的填法。
具体实现:
import java.util.*;public class Main{ static int[] a={1,2,3,4,5,6,8,9,10,12};//总集 static int[] book=new int[13];//标记集-标记总集中的数是否已经被使用过 static int mod[]=new int[a.length];//符合要求的数集 static int sum=0;//所有种类的计数 public static void dfs(int step){//递归函数-step是mod结果集的下标 if(step==10){//递归出口,当mod元素为10个时候,准备跳出 int s1=mod[0]+mod[5]+mod[6]+mod[3]; if(s1==mod[0]+mod[9]+mod[8]+mod[2]&&//进行五条直线数的比较,判断条件是否符合 s1==mod[4]+mod[5]+mod[9]+mod[1]&& s1==mod[4]+mod[6]+mod[7]+mod[2] && s1==mod[3]+mod[7]+mod[8]+mod[1]){ sum++;//符合条件,计数加一 } return;//跳出递归 }else{ for(int i=0;i<a.length;i++){//遍历总集 if(book[a[i]]==0){//判断-当前元素是否被使用过 mod[step]=a[i];//符合条件,将当前元素添加进mod数集 book[a[i]]=1;//将当前元素标记为已使用 dfs(step+1);//mod数集元素多了一个,再次调用自身 book[a[i]]=0;//回溯-回收元素,深度优先搜索,搜索到当前路径的尽头,回退再尝试 } } } } public static void main(String[] args) { dfs(0); System.out.println(sum/10);//结果集中有同一组解一共十种情况,旋转五种,镜像五种 }}
通过设置标记,记录哪些元素已经被访问过了,访问过的元素不再参与下面的排列组合,类似剪枝操作。
精华部分在24行的递归调用自身和25行的回溯思想,深度优先搜索。
1 0
- 五星填数与深度优先搜索回溯思想
- 五星填数--回溯
- 浅谈回溯与深度优先搜索
- 方格填数【相邻两数互质】-DFS深度优先搜索
- 回溯--深度优先搜索(数字n的组合数)
- dfs 五星填数
- 五星填数
- hud1010回溯深度优先搜索
- 回溯法--深度优先搜索
- 栈:深度优先搜索与回溯算法求解迷宫
- 深度优先搜索思想入门!
- 五星填数_蓝桥杯
- 历届试题 五星填数
- 蓝桥杯题 五星填数(dfs)
- 五星填数-蓝桥杯决赛
- 回溯法实例-深度优先搜索
- [算法专题] 深度优先搜索&回溯剪枝
- [算法专题] 深度优先搜索&回溯剪枝
- apacheActiveMQ(一)
- .net Image Resize
- mysql 字符串连接 concat、gropu_concat用法
- JavaWeb之JSP
- qt creator编译opus库
- 五星填数与深度优先搜索回溯思想
- numpy初始化数组时遇到的问题
- 【Android 】Dalvik虚拟机和JVM虚拟机的区别
- 在myeclipse中如何让console最小化成一个图标
- Unix环境高级编程(阅读笔记)-----kill、raise、alarm、pause函数
- Android读取系统mp3文件
- 实现一个固定长度的集合,每个1s中刷新一次,第一个元素去掉,从最后面添加一个元素。
- 项目二 实现复数类中的运算符重载(2)
- 求二进制中1的个数