一个环由个圈组成,把自然数1,2,…,N分别放在每一个圆内,数字的在两个相邻圈之和应该是一个素数。 注意:第一圈数应始终为1。input: N(0~20)output:输出格式如下所示的样品。

一个环由个圈组成,把自然数1,2,…,N分别放在每一个圆内,数字的在两个相邻圈之和应该是一个素数。 注意:第一圈数应始终为1。

input: N(0~20)

output:输出格式如下所示的样品。每一行表示在环中的一系列圆号码从1开始顺时针和按逆时针方向。编号的顺序必须满足上述要求。打印解决方案的字典顺序。

源代码:

#include<stdio.h>
int a[20]={0},k=0,c,v,mark[20]={0},N;

int solution(int x,int y) //对是否为素数进行判断
{
    c=x+y;
    for(int i=2;i<c;i++)
    {
        v=c%i;
    if(v==0) return 0;
    }
    return 1;
}
void print()
{
    printf("顺时针方向:");
    for(int j=0;j<N;j++)
    {
        printf("%d ",a[j]);

    }
    printf("逆时针方向:");
    while(j>=0)
    {
        printf("%d ",a[j]);
        j--;
}
    printf("\n");
}
void dfs(int k)
{
    if(k==N-1) //找到目标值则打印输出
    {
         print();
         return;
    }
    for(int j=2;j<=N;j++)
    {
        if(solution(a[k],j)==1&&!mark[j]) //判断是否标记过,并且满足素数条件
        {mark[j]=1;  //标记已访问
        a[k+1]=j;  //赋值
            dfs(k+1); //递归
            mark[j]=0; //回溯
        }
    }
}
int main()
{a[0]=1;
    scanf("%d",&N);
    dfs(0);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值