懂得递归和剪枝,遥远就不远了,一个编程题的感受
来源:互联网 发布:蚁群算法 知乎 编辑:程序博客网 时间:2024/06/04 18:49
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求: "4 "不能在第三位, "3 "与 "5 "不能相连。
分析与解答:
速度最快,最简单的算法如下,通过那两个约束条件来极大减少搜索空间,只需一个函数就可以满足要求;
只需调用下面这函数就行,设置为
a={1,2,2,3,4,5}; level = 1; prev = -1;
有兴趣的可以研究一下,是不是效果最好的一个
- String[] f(int[] a, int level, int prev) {
- // 只有一个元素,则返回这一个元素即可,这个是原子条件
- if (a.length <= 1) {
- return new String[] { String.valueOf(a[0]) };
- }
- String[] arr = null;
- ArrayList<String> list = new ArrayList<String>();
- int[] b = null;
- for (int i = 0; i < a.length; i++) {
- // 通过两个约束条件来极大的减少搜索空间
- if (level == 3 && a[i] == 4) {// 第三层不能有4
- continue;
- }
- if (prev == 3 && a[i] == 5 || prev == 5 && a[i] == 3) {// 3和5顺序出现
- continue;
- }
- // b作为下一个递归条件的开始,其内容是出了a中当前节点之外的其他节点构成的数组
- b = new int[a.length - 1];
- for (int j = 0, k = 0; j < a.length; j++) {
- if (j != i) {
- b[k++] = a[j];
- }
- }
- // 递归调用,对下一层节点进行分析。
- String[] str = f(b, level + 1, a[i]);
- // 组合起来,当前节点和下层节点的返回值组合起来作为整个返回值
- for (int strIndex = 0; strIndex < str.length; strIndex++) {
- list.add(String.valueOf(a[i]) + str[strIndex]);
- }
- }
- arr = list.toArray(new String[1]);
- return arr;
- }
有兴趣仔细分析之后就知道搜索空间的减少了很多
- 懂得递归和剪枝,遥远就不远了,一个编程题的感受
- 懂得坚持,胜利就不远了
- 懂得了泪就懂得了人生
- 懂得了遗憾,就懂得了人生
- 计算机自动编程不远了
- WPS的那些神技巧你会了就离升职加薪不远了
- 嫁给以下十种男人的女人离地狱就不远了
- 当别人开始说你是疯子的时候,你离成功就不远了
- 把自己都感动的时候,离成功就不远了
- 高僧与少女的私生子!看懂了,你离成功就不远!
- 一个遥远的梦想
- 男人彻底懂得一个女人之后就不会爱她了吗?
- 拥有了就应该懂得珍惜
- 放下这八件事 你就离成功不远了
- 放下这八件事 你就离成功不远了
- 放下这八件事 你就离成功不远了
- 放下这八件事 你就离成功不远了
- 放下这八件事,你就离成功不远了
- 截屏的代码(JAVA)
- 《PetShop》系列之二 PetShop数据访问层之数据库访问设计
- 在线视频的过去,现在和未来
- AJAX的EMAIL验证
- SIP简介,第1部分:SIP初探
- 懂得递归和剪枝,遥远就不远了,一个编程题的感受
- Perils in RMT
- 积累最终会沉淀 要习惯积累
- SOA厂商的误区:偏重集成忽略架构
- 怎样才是一个真正的DBA?
- SQL连接超时 问题解决方法一
- 如何化异步为同步?
- js动态生成表格的性能调优
- xml+xsl+htc,web控件开发的理想组合