Prime Ring Problem(深搜初体验)

题目描述

*A ring is compose of n circles as shown in diagram. Put naturalnumber 1, 2, …, n into each circle separately, and the sum of numbers in twoadjacent circles should be a prime.
Note: the number offirst circle should always be 1.
如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆圈中,并且相邻两个圆圈中的数字总和应为素数。
注意:第一个圆圈的数量应该始终为1*

题目链接为http://acm.hdu.edu.cn/showproblem.php?pid=1016

考核知识点

深搜+素数

常见误区

  1. 在每个案例后打印一个空行(是奇数也要打空行)。

  2. 输出的空格问题

  3. 题意不清楚

解题思路

首先要清楚1.这是个深搜问题2应该分成三类(1和偶数和除1以外的所有奇数)讨论3.有两个函数(一个判断是不是素数一个用来输出结果)4.深搜的出口和常规代码

#include <stdio.h>
#include <string.h>
#include <math.h>
#include<algorithm>
int n,a[25],b[25];

bool prime(int n)//判断该数是否是 素数
{
    int i;
    if(n<2)   //小于2的都不是素数 返回false
        return false;
    else
    {
        for(i=2;i<=sqrt(n);i++)//从二开始 到该数开平方
            if(n%i==0)//如果可以被从二开始 到该数开平方整数,就跳出循环
                break;
        if(i>sqrt(n))//判断是否是正常结束,如果是正常 返回true
            return true;
        else         //不是正常结束,返回flase
            return false;
    }
}

void print(int a[],int n) //输出结果
{
    int i;
    for(i=1;i<=n;i++) 
    {
        printf("%d",a[i]);     //输出素数
            if(i!=n)           //如果该数不是范围内最后一个素数 输出一个空格
            printf(" ");
        else                 //如果该数不是范围内最后一个素数 输出一个换行
            printf("\n");
    }
}

void dfs(int s)
{
    int i;
    if(s==n+1)                       //表示进行到最后一个数
    {
        if(prime(a[n]+a[1]))         //判断最后一个跟第一个的和是不是素数
            print(a,n);              //输出结果
        return ;
    }
    for(i=2;i<=n;i++)                //每一次都是从2开始 到n
        if(prime(a[s-1]+i)&&b[i]==0) //判断 这个数和前一个数的和是不是素数并且这个数出现过没
        {                               // 这个数和前一个数的和是素数并且这个数没出现过
            a[s]=i;                     //令第【s】个数为 i
            b[i]=1;                     //标记为1 表示出现过
            dfs(s+1);                    //递归
            b[i]=0;                     //这条路走死了, 让这个数标记为0 表示没出现过进行下次递归
        }
}

int main()
{
    int t=0;
    while(scanf("%d",&n)!=EOF)
    {
        memset(b,0,sizeof(b));//初始化为0 表示都没有出现
        t++;
        printf("Case %d:\n",t);
        if(n==1)
            printf("1\n");//如果是1的话 直接输出1
        else if(n%2!=0)
            continue;  //如果是1以外的奇数,那么肯定会有两个奇数连在一起,不符合要求
        else
        {
            a[1]=1;   //令它从1开始
            b[1]=1;   //标记 1的话已经出现
            dfs(2);   // 2表示第2个数
        }
        printf("\n");
    }
    return 0;
}

示例
Sample Input
6
8

Sample Output
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

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/shuisebeihuan/article/details/80501713