我的分配有问题,我们需要在c ++中为数字实现递归排列。 这是部分工作的代码,但缺少一些数字。 我找不到问题所在。
此代码确实有效,但不完全正确。
此代码采用数组和该数组的大小。 在这种情况下,我试图解决当我发送超过3个数字的数组时出现的问题。如果我发送3个号码,则输出为:
///
1 2 3 /
1 3 2 /
3 1 2 /
2 1 3 /
2 3 1 /
3 2 1 /
这种情况下的输出是正确的。但是当我将数组设置为4并发送它的大小时,我得到:
///
1 2 3 4 /
1 2 4 3 /
1 4 2 3 /
4 1 2 3 /
**2 1 3 /
2 3 1 /
3 2 1 /**
3 2 1 4 /
3 2 4 1 /
3 4 2 1 /
4 3 2 1 /
输出部分正确,但缺少一些数字。
程序应该输出数组中所有可能的数字变体
#include <iostream>
using namespace std;
bool nextPermutation(int[],int);
void swap(int&, int&);
int Maxind(int[],int);
int Minind(int[],int);
void print (int[], int);
bool test (int[], int);
int fl=0;
int main() {
int a[]={1,2,3,4};
nextPermutation(a,4);
return 0;
}
void print(int a[], int s) {
for(int i=0; i<s; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
bool nextPermutation(int a[], int s)
{
int i=Maxind(a,s);
if(fl==0)
print(a,s);
if(i!=0) {
swap(a[i],a[i-1]);
nextPermutation(a,s);
}
else if(i==0 && test(a,s))
{
int p=a[0];
for(int i=0; i<=s-2; i++)
a[i]=a[i+1];
fl=1;
nextPermutation(a,s-1);
a[s-1]=p;
fl=0;
nextPermutation(a,s);
}
else
return false;
}
bool test (int a[], int s) {
if (Maxind(a,s)==0 && Minind(a,s)==s-1)
return false;
else
return true;
}
void swap(int& a, int& b)
{
int t=a; a=b; b=t;
}
int Maxind(int a[], int s)
{
int m=a[0], ind=0;
for(int i=0; i<s; i++)
if(m<a[i]) {
m=a[i];
ind=i;
}
return ind;
}
int Minind(int a[], int s)
{
int m=a[0], ind=0;
for(int i=0; i<s; i++)
if(m>a[i]) {
m=a[i];
ind=i;
}
return ind;
}
答案 0 :(得分:1)
您需要发送所有可能的排列。
如果您更改main
功能,您将获得解决方案。在主要功能中添加loop
,然后使用变量nextPermutation(a, i)
发送至i
int main() {
for(int i = 1; i < 5; i++) {
int a[]= {1,2,3,4};
nextPermutation(a,i);
}
return 0;
}
你应该调试你的程序,并且我发现你的s值在这里消失:
else if(i==0 && test(a,s)) {
int p=a[0];
for(int i=0; i<=s-2; i++) {
a[i]=a[i+1];
}
fl=1;
nextPermutation(a,s-1);
//*** careful you are decreasing s here and your output gives 3 numbers. !!***
a[s]=p;
fl=0;
nextPermutation(a,s);
}
答案 1 :(得分:1)
我刚刚修改了代码的nextPermutation方法,如下所示。它可以工作。
bool nextPermutation(int a[], int s)
{
if(s == 0)
return false;
int i=Maxind(a,s);
if(fl==0)
print(a,s);
if(i!=0) {
swap(a[i],a[i-1]);
if(fl == 0)
nextPermutation(a,s);
else{
int temp = fl;
fl = 0;
nextPermutation(a,s+temp);
}
}
else if(i==0){
int p=a[0];
for(int i=0; i<=s-2; i++)
a[i]=a[i+1];
a[s-1]=p;
fl+=1;
nextPermutation(a,s-1);
}
else
return false;
}
我还删除了方法test和Minind,因为它们在我的代码中没用。