全排列與素數環問題
阿新 • • 發佈:2019-02-10
結果:
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輸出樣例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; }