//  permute - 全排列 - 开始
template<typename Data>
void _permute(Data *a, int n, int k, void (*f)(Data *, int)) {
    if(k+1 == n) f(a, n);
    else for(int i=k; i<n; i++) {
        std::swap(a[k], a[i]);
        _permute(a, n, k+1, f);
        std::swap(a[k], a[i]);
    }
}

template<typename Data>
void permute(Data *a, int n, void (*f)(Data *, int)) {
    _permute(a, n, 0, f);
}
//  permute - 全排列 - 结束
//  combine - 组合 - 开始
template<typename Data>
void _combine(Data *a, int n, int m, int k, Data *b, void (*f)(Data *, int)) {
    for(int i=n-1; i>=m-k-1; i--) {
        b[m-k-1] = a[i];
        if(m-k-1 == 0) f(b, m);
        else _combine(a, i, m, k+1, b, f);
    }
}

template<typename Data>
void combine(Data *a, int n, int m, void (*f)(Data *, int)) {
    Data b[m];
    _combine(a, n, m, 0, b, f);
}
//  combine - 组合 - 结束

一͛世͛珍͛藏͛
86 声望6 粉丝

« 上一篇
队列和堆栈
下一篇 »
二叉树