Я получаю вывод как:
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;
}