递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程

来源:互联网 发布:基金仓位测算数据 编辑:程序博客网 时间: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;  
    }

0 0