1. 程式人生 > >全排列與素數環問題

全排列與素數環問題

結果:

1234

1243
1324
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;
}