• ObjectARX递归AcArray数组组合函数


    ObjectARX递归AcArray数组组合函数

    图文by edata  , 转载注明出处 http://www.cnblogs.com/edata 

    ObjectARX QQ群: 630401507 (仅ObjectARX)
    AutoCAD.net QQ群: 193522571 (ObjectARXAutoLispAutoCAD.net)

    函数源码

     为了通用,写为函数模板.代码如下

        // 指定组合数量递归函数模板(1 2 3) n=1 => (1) (2) (3) n=2 => (1 2) (1 3) (2 3)
        template <class T>
        static AcArray<T> combination(T arr,int m)
        {
            AcArray<T> arrs;
            if (arr.length()>0 && m > 0)
            {
                T cdr=arr;
                cdr.removeFirst();            
                AcArray<T> tmparrs1=combination(cdr,m-1);
                if (tmparrs1.isEmpty() && m ==1)
                {
                    T tmp;
                    tmp.append(arr.first());
                    arrs.append(tmp);
                }
                else
                {
                    for (int i=0;i<tmparrs1.length();i++)
                    {                
                        tmparrs1.at(i).insertAt(0,arr.first());
                    }
                    arrs.append(tmparrs1);                    
                }
                AcArray<T> tmparrs2 = combination(cdr,m);
                if (!tmparrs2.isEmpty())
                {
                    arrs.append(tmparrs2);
                }                        
            }
            return arrs;
        }
    
        //全部组合函数模板(1 2 3) => (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3)
        template <class T>
        static AcArray<T> combination(T arr)
        {    
            AcArray<T> arrs;        
            for (int i=1;i<=arr.length();i++)
            {
                //调用递归
                AcArray<T> tempArray =combination(arr,i);
                arrs.append(tempArray);            
            }
            return arrs;
        }

    注意:第二个依赖第一个函数.

    使用实例

    使用AcGeIntArray做示例,只要是使用AcArray构成的类型,都可以.比如arx自带的AcDbObjectArray,自己使用AcArray定义的类型都可以...

            //此处使用ARX自带的AcGeIntArray做示例
            AcGeIntArray a;
            //第一种方式,
            AcArray<AcGeIntArray> arrs;
            //第二种方式,使用typedef定义一个类型别名
            //typedef AcArray<AcGeIntArray> AcGeIntArrays;
            //AcGeIntArrays arrs;
    
            //初始化数组
            for (int i=0;i<3;i++)
            {
                a.append(i+1);
            }
    
            //调用组合函数        
            arrs=combination(a);        
            //输出组合结果
            acutPrintf(_T("
    组合结果
    "));
            for (int i=0;i<arrs.length();i++)
            {
                AcGeIntArray tmp=arrs.at(i);
                for (int j=0;j<tmp.length();j++)
                {
                    acutPrintf(_T("%d "),tmp.at(j));
                }
                acutPrintf(_T("
    "));
            }

    组合函数结果图

  • 相关阅读:
    hdoj_1800Flying to the Mars
    SPFA模版
    树状数组
    hdoj_1385Minimum Transport Cost
    hdoj_2112
    hdoj_3665Seaside
    Java的垃圾回收之算法
    Oracle和MySQL、PostgreSQL特性对比
    什么是java对象的强、软、弱和虚引用
    线程池(java.util.concurrent.ThreadPoolExecutor)的使用(一)
  • 原文地址:https://www.cnblogs.com/edata/p/14403502.html
Copyright © 2020-2023  润新知