двойное освобождение или повреждение (вне) Прервано (ядро сброшено) в рекурсии - PullRequest
0 голосов
/ 23 октября 2018

Я получаю вывод как:

1 
2 
double free or corruption (out)
Aborted (core dumped)

Я думаю, что есть некоторая проблема с изменением массива 'f'.Но я не могу это выяснить и исправить.Эта часть кода вызывает проблемы

if (! F [i]) {r.push_back (ar [i]);F [I] = 1;}

Комментирование f [i] = 1;здесь удаляет ошибку, но дает неожиданный результат.

Вот вся моя программа (пытающаяся сгенерировать перестановки вектора A):

#include<bits/stdc++.h>
using namespace std;
void findNumbers(vector<int>& ar,
                bool *f,
                set<vector<int> >& res, 
                vector<int>& r,int cnt) 
{   
    if(cnt==ar.size())
    {
        res.insert(r);
        return;
    }

    for (int i=0; i < ar.size() ;i++) 
    {   
        if(!f[i]){
            r.push_back(ar[i]);
            f[i]=1;
        }

        findNumbers(ar,f,res,r,cnt+1); 
        r.pop_back();
        if(f[i]) f[i]=0;
    } 

} 

int main(){
    vector<int> A;
    A.push_back(1);A.push_back(2);
    vector<int> r;
    bool flag[A.size()];
    vector<vector<int> > res; 

    if(A.size()==0) return 0;

    for (int i = 0; i < A.size(); ++i) {
        flag[i]=0;
    }

    set<vector<int> > ans;
    findNumbers(A,flag, ans, r,0); 
    vector<int> temp;

    for (auto it1 = ans.begin(); it1!=ans.end(); ++it1) {
        temp=*it1;
        for(auto i=0;i<temp.size();i++)
            cout<<temp[i]<<" ";
        cout<<"\n";
    }


    return 0;
}

Обновление:

После внесения изменений, предложенных в ответе 'rafix07', я смог сгенерировать перестановки, используя следующий код:

#include<bits/stdc++.h>
using namespace std;
void findNumbers(vector<int>& ar,
                vector<bool>& f,
                set<vector<int> >& res, 
                vector<int>& r,int cnt) 
{   
    if(ar.size()==cnt)
    {
        res.insert(r);
        return;
    }

    for (int i=0; i < ar.size() ;i++) 
    {   
        if(!f[i])
    {
            r.push_back(ar[i]);
            f[i]=1;
        }
    else continue;

        findNumbers(ar,f,res,r,cnt+1);

    if(!r.empty())
        r.pop_back();
        f[i]=0;
    } 

} 

int main(){
    vector<int> A;
    A.push_back(1);
    A.push_back(2);
    A.push_back(3);
    vector<int> r;
    vector<bool> flag;
    vector<vector<int> > res; 

    if(A.size()==0) return 0;

    for (int i = 0; i < A.size(); ++i)
        flag.push_back(0);


    set<vector<int> > ans;
    findNumbers(A,flag, ans, r,0); 
    vector<int> temp;
    for (auto it1 = ans.begin(); it1!=ans.end(); ++it1) {
        temp=*it1;
        for(auto i=0;i<temp.size();i++)
            cout<<temp[i]<<" ";
        cout<<"\n";
    }


    return 0;
}
...