我正在Dev C ++中运行它,它为我提供了ID返回1退出状态。我在这里做错了什么?
长度为n的排列是一个数组,其中包含从1到n的n个不同整数(任意顺序)。例如,[2,3,1,5,4]是一个排列,但是[1,2,2]不是排列(2在数组中出现两次),[1,3,4]也不是排列排列(n = 3,但数组中有4个)。
让p为长度为n的任何排列。我们将p的指纹F(p)定义为p中相邻元素之和的排序数组。更正式地说,
F(p)= sort([p1 + p2,p2 + p3 ... 例如,如果n = 4且p = [1,4,2,3],则指纹由F(p)= sort([1 + 4,4 + 2,2 + 3])= sort( [5,6,5])= [5,5,6]。
您将获得长度为n的排列p。您的任务是找到具有相同指纹的其他排列p'。如果存在某个索引i使得pi≠p'i,则认为两个置换p和p'是不同的。
#include <bits/stdc++.h>
using namespace std;
int* fingerprint(int p[],int n)
{
int fp[n-1];
for(int i=0;i<n-1;i++)
{
fp[i]=p[i]+p[i+1];
}
sort(fp,fp+n-1);
return fp;
}
void display(int p[],int n)
{
for(int i=0;i<n;i++)
cout<<p[i]<<" ";
cout<<endl;
}
void equality(int p[],int* fp,int n)
{
int* fp1=fingerprint(p,n);
int c=0;
for(int i=0;i<n-1;i++)
{
if(fp[i]!=fp1[i])
c=1;
}
if(c==0)
display(p,n);
}
void findpermutations(int p[],int n)
{
int* fp=fingerprint(p,n);
sort(p,p+n);
do{
equality(p,fp,n);
}while(next_permutation(p,p+n));
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int p[n];
for(int i=0;i<n;i++)
{
cin>>p[i];
}
findpermutations(p,n);
}
return 0;
}
输入:
3
2
1 2
6
2 1 6 5 4 3
5
2 4 3 1 5
输出:
2 1
1 2 5 6 3 4
3 1 5 2 4
答案 0 :(得分:0)
我看到的是C和C ++之间的混合,如果我们使用向量而不是指针(因为为什么不使用指针),它将看起来像这样:
vector<int> fingerprint(int p[],int n)
{
vector<int> fp;
fp.resize(n-1);
for(int i=0;i<n-1;i++)
{
fp[i]=p[i]+p[i+1];
}
sort(fp.begin(),fp.end());
return fp;
}
void equality(int p[],vector<int> fp,int n)
{
vector<int> fp1=fingerprint(p,n);
int c=0;
for(int i=0;i<n-1;i++)
{
if(fp[i]!=fp1[i])
c=1;
}
if(c==0)
display(p,n);
}
void findpermutations(int p[],int n)
{
vector<int>fp = fingerprint(p,n); //n-1
sort(fp.begin(),fp.end());
do{
equality(p,fp,n);
}while(next_permutation(p,p+n));
}