C ++ Backtracking перестановки - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь напечатать все перестановки набора {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;
}

1 Ответ

0 голосов
/ 09 мая 2018

Исходя из @ 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> inputs{1,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;
    }
}

Выход:

enter image description here

...