C++ 回溯排列

Posted

技术标签:

【中文标题】C++ 回溯排列【英文标题】:C++ Backtracking permutations 【发布时间】:2018-05-09 10:43:19 【问题描述】:

我正在尝试打印集合 1, 2, ...N 的所有排列,但没有成功。 我试图通过回溯来实现它。当我向排列添加一个元素时,我检查它是否不存在,然后检查它是否是一个解决方案(如果排列中有 N 个数字),然后打印它。 我正在寻找是否有人可以帮助我指出代码中的缺陷。

#include<iostream>
#include<cstdlib>
#define MAX 9
using namespace std;

int check(int *s, int N)  //checking if the elements of the permutation are all distinct
    for (int i = 1; i <= N - 1; i++)
        for (int j = i + 1; j <= N; j++)
            if (s[i] == s[j])
                return 0;
    return 1;


int solution(int *s, int k, int N)  //if we have reached N numbers it's a solution
    if (k == N)
        return 1;
    return 0;


void print_solution(int *s, int N)  //print the permutation
    for (int i = 1; i <= N; i++)
        cout << s[i] << " ";
    cout << endl;


void permutation_bkt(int *s, int k, int N)  //backtracking permutations
    for (int i = 1; i <= N; i++) 
        s[k] = i;
        if (check(s, N)) 
            if (solution(s, k, N)) 
                print_solution(s, N);
            
            else 
                permutation_bkt(s, k++, N);
            
        
    


int main() 
    int s[MAX], k = 1;
    int N; cout << "N= "; cin >> N;
    permutation_bkt(s, k, N);
    system("Pause");
    return 0;

【问题讨论】:

std::next_permutation ? C++ 使用 0 索引,而不是 1 索引。 我只是在查看 next_permutation 解决方案(infoarena.ro/job_detail/147505?action=view-source)。我仍然希望实现回溯功能。我的排列需要从 1 开始。@Jarod42 记住k++ 做了什么:它改变了变量k,结果值是k值。我想你想要k+1 代替。 也许你应该检查N&lt;MAX。使用 1-indexing 会起作用,但是您在索引 0 处浪费了未使用的元素。 【参考方案1】:

基于@Jarod42,这是我尝试过的。

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

void print(vector<int>& vec)

    do 
        for(auto ele:vec)
           std::cout << ele << " ";
        
        cout <<endl;
     while(std::next_permutation(vec.begin(), vec.end()));


int main()

    vector<int> inputs1,2,3; 
    vector<int> vec;
    for(int i= 1;i<=inputs.size();i++) 

        for(int j=0;j<i;j++)
            vec.push_back(inputs[j]);
        

        print(vec);
        vec.clear();
        cout <<endl<<endl;
    

输出:

【讨论】:

以上是关于C++ 回溯排列的主要内容,如果未能解决你的问题,请参考以下文章

回溯算法----全排列

力扣784. 字母大小写全排列 回溯法 C++递归和非递归俩种实现非方式

LeetCode 31:递归回溯八皇后全排列一篇文章全讲清楚

高频面试题LeetCode 31:递归回溯八皇后全排列一篇文章全讲清楚

c++,全排列输出,递归的应用

回溯2--部分全排列