NY488 素数环

素数环

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

NY488 素数环_第1张图片

输入
有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。
输出
每组第一行输出对应的Case序号,从1开始。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。
样例输入
6
8
3
0
样例输出
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Case 3:
No Answer


解题思路:同全排列深搜思路一样,只是深搜递归那加了一处判断相邻和为素数的条件!还有一点是输出时判断首末和为素数时输出。

素数环只需判断偶数,奇数肯定构不成,因为奇数的话,奇数比偶数多一个,所以必然有俩个奇数会相邻,奇+奇 = 偶,而偶数不是素数!


#include <stdio.h>
#include <math.h>
int n,cot,a[22]={0,1},visit[22];
int judge(int n)//判断素数
{
    int i;
    for(i=2;i<=sqrt(n);i++)
    {
        if(n % i == 0)
            return 0;
    }
    return 1;
}
void dfs(int step)
{
    int i,temp;
    if(step == n)//个数达到时输出
    {
        temp = a[1] + a[n];
        if(judge(temp))//判断首尾和是否为素数
        {
            for(i=1;i<=n;i++)
                printf("%d ",a[i]);
            printf("\n");
        }
        return;
    }
    for(i=2;i<=n;i++)
    {
        if(!visit[i])//没有访问过
        {
            visit[i] = 1;//标记已访问
            a[step+1] = i;//放入值
            temp = a[step] + a[step+1];//相邻俩数相加
            if(judge(temp))
               dfs(step+1);//是素数继续搜索
            visit[i] = 0;//回溯
        }
    }
}
int main()
{
    while(~scanf("%d",&n) && n)
    {
         printf("Case %d:\n",++cot);
         if(n == 1)
         {
             printf("1\n");
             continue;
         }
         if(n%2)//奇数构不成素数环
         {
             printf("No Answer\n");
             continue;
         }
        dfs(1);

    }
    return 0;
}


你可能感兴趣的:(NY488 素数环)