AcWing - 94 - 递归实现排列型枚举(全排列)

题目链接点我OvO
全排列的模板....之前也学过一种全排列但是那个并不能按字典序从小到大输出

int a[] = {1, 2, 3, 4, 5};
void solve(int u) {
    if (u==n) {
        for (int i = 0; i<n; ++i)
            printf(i==n-1 ? "%d\n" : "%d ", a[i]);
        return;
    }
    for (int i = u; i<n; ++i) {
        swap(a[i], a[u]);
        solve(u+1);
        swap(a[i], a[u]);
    }
}
//调用solve(0);

然后今天看xc大佬的视频又学了一种方法,之前的方法是选一个没交换过的数和当前的数交换,而下面的方法是每次选中排列中的一个位置,然后枚举前面没有用过的数塞到这个位置里面

int n; vector<int> path;
void solve(int u, int state) {
    if (u==n) {
        for (int i = 0; i<n; ++i)
            printf(i==n-1 ? "%d\n" : "%d ", path[i]);
        return;
    }
    for (int i = 0; i<n; ++i) {
        if (!(state >> i & 1)) {
            path.push_back(i+1);
            solve(u+1, state | (1<<i));
            path.pop_back();
        }
    }
}
//调用solve(0, 0);
posted @ 2020-03-17 17:44  shuitiangong  阅读(160)  评论(0编辑  收藏  举报