递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
来源:互联网 发布:基金仓位测算数据 编辑:程序博客网 时间:2024/06/17 02:26
//虽然解答树和一般树都需要用递归来解决,但是解答树和一般树比如二叉树多叉树图转多叉树不同的是,解答树通过递归枚举进行元素重组排列最终获得的是一个排列或者集合,没有树状结构,他需要引入根节点但是通过if else 进行结束条件的判定和结果的输出;而一般树通过递归查找获得子节点,一般树具有明显的树状的数据结构,引入根结点通过判断空树结束
//解决解答树的方法:递归枚举,子集生成,排列生成,回溯都是
//dfs bfs处理一般树
//解答树和一般树虽然思考方法不同,但是他们的思想是一样的,都是引入根节点(一个位置元素),空树条件(结束条件),遍历子节点(其他位置元素)完成的。
//解答树回溯法会把每个分支都判断完成,可能不会深入到最底层完成整个排列,但是dfs bfs一般树会渗入到最底下的子节点
//回溯法是一种递归枚举
//注意在递归中保存过程可以用数组
//注意递归回溯法处理解答树问题用数值记录保存已经排序的情况和过程,通过回溯可以回到这些过程,所以不用害怕出现Uva除法 的那个情况,不满足情况需要删掉即回溯到以前的状态
//递归回溯解决解答树通过数值跟踪记录排序过程,大胆用
//Uva The Sultan's Successors
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int used[10];
int judge( int a, int b )
{
if ( b > 98765 ) return 0;
for ( int i = 0 ; i < 10 ; ++ i )
used[i] = 0;
if ( a < 10000 ) used[0] = 1;
while ( a ) {
used[a%10] = 1;
a /= 10;
}
while ( b ) {
used[b%10] = 1;
b /= 10;
}
int sum = 0;
for ( int i = 0 ; i < 10 ; ++ i )
sum += used[i];
return (sum == 10);
}
int main()
{
int n, T = 0;
while ( ~scanf("%d",&n) && n ) {
if ( T ++ ) printf("\n");
int count = 0;
for ( int i = 1234 ; i < 100000 ; ++ i ) {
if ( judge( i, i*n ) ) {
printf("%05d / %05d = %d\n",i*n,i,n);
count ++;
}
}
if ( !count )
printf("There are no solutions for %d.\n",n);
}
return 0;
}
//解决解答树的方法:递归枚举,子集生成,排列生成,回溯都是
//dfs bfs处理一般树
//解答树和一般树虽然思考方法不同,但是他们的思想是一样的,都是引入根节点(一个位置元素),空树条件(结束条件),遍历子节点(其他位置元素)完成的。
//解答树回溯法会把每个分支都判断完成,可能不会深入到最底层完成整个排列,但是dfs bfs一般树会渗入到最底下的子节点
//回溯法是一种递归枚举
//注意在递归中保存过程可以用数组
//注意递归回溯法处理解答树问题用数值记录保存已经排序的情况和过程,通过回溯可以回到这些过程,所以不用害怕出现Uva除法 的那个情况,不满足情况需要删掉即回溯到以前的状态
//递归回溯解决解答树通过数值跟踪记录排序过程,大胆用
//Uva The Sultan's Successors
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int used[10];
int judge( int a, int b )
{
if ( b > 98765 ) return 0;
for ( int i = 0 ; i < 10 ; ++ i )
used[i] = 0;
if ( a < 10000 ) used[0] = 1;
while ( a ) {
used[a%10] = 1;
a /= 10;
}
while ( b ) {
used[b%10] = 1;
b /= 10;
}
int sum = 0;
for ( int i = 0 ; i < 10 ; ++ i )
sum += used[i];
return (sum == 10);
}
int main()
{
int n, T = 0;
while ( ~scanf("%d",&n) && n ) {
if ( T ++ ) printf("\n");
int count = 0;
for ( int i = 1234 ; i < 100000 ; ++ i ) {
if ( judge( i, i*n ) ) {
printf("%05d / %05d = %d\n",i*n,i,n);
count ++;
}
}
if ( !count )
printf("There are no solutions for %d.\n",n);
}
return 0;
}
0 0
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法
- 解答树问题可分为子集生成和排列生成问题,都可以用回溯法解决并且是很优化的方案
- 枚举生成排列的方法总结
- (排列生成算法)枚举排列的两种方法:递归枚举和next_permutation (使用多用next_permutation)
- 递归枚举排列@递归回溯
- 枚举 子集生成
- 生成1~~n的排列 && 子集
- ACM:回溯法,子集生成
- Permutations 排列的生成, 递归
- 全排列与子集生成
- 子集生成+stl全排列
- 生成排列的方法
- 递归解决全排列生成算法
- 递归解决全排列生成算法
- 递归解决全排列生成算法
- 递归解决全排列生成算法
- 使用递归的方法生成一个序列的所有排列
- LAMP环境安装
- 几条汇编指令
- 2016-09-25
- Python 基础回顾(三)
- 遇到问题---java--hibernate多线程中使用getCurrentSession报错innerSetException
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
- UGUI研究院之Text文本渐变
- Java synchronized 理解
- 地址加法器合成物理地址
- 段的概念
- 段寄存器
- 关于SQL的连接查询
- 自定义View之扩展式
- Leetcode #357 Count Numbers with Unique Digits