结果:
1234
12431324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
#include <iostream>
#include <cstdio>
#include<algorithm>
using namespace std;
void perm(int k,int n,int a[])
{
if(k>=n-1)
{
for(int i=0;i<n;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
else
{
for(int i=k;i<n;i++)
{
swap(a[k],a[i]); // 第一层的交换是自己交换自己本身
perm(k+1,n,a); //交换后递归下一层
swap(a[k],a[i]);
}
}
}
int main()
{
int n;
scanf("%d",&n);
int a[100];
for(int i=0;i<n;i++)
{
a[i]=i+1;
}
perm(0,n,a);
return 0;
}
1551.求给定一组数能构造多少个素数环
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定一组正整数,把他们排成一个环,任意相邻的两个数之和为素数的环称为素数环,问这组数能构成多少个素数环?
输入
先输入一个小于等于16的正整数n,然后输入给定的n个不相同的小于等于16的正整数。
输出
输出这组数能够成的不同的素数环的个数。
输入样例
4
1 2 3 4
1 2 3 4
输出样例
2
感觉答案有 问题 这道题没过!
#include <iostream>
#include <cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int cnt=0;
bool isprime(int n)
{
int k=(int)sqrt(n);
for(int i=2;i<=k;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
void perm(int k,int n,int a[])
{
if(k>=n)
{
if(!isprime(a[1]+a[n]))
return;
if(isprime(a[1]+a[n]))
{
/* for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");*/
cnt++;
}
}
else
{
for(int i=k;i<=n;i++)
{
swap(a[k],a[i]); // 第一层的交换是自己交换自己本身
if(isprime(a[k]+a[k+1]))
perm(k+1,n,a);//交换后递归下一层
swap(a[k],a[i]);
}
}
}
int main()
{
int n;
scanf("%d",&n);
int a[100];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
perm(1,n,a);
printf("%d\n",cnt);
return 0;
}