Prime Ring Problem 回溯法

经过了太多曲折终于做出来了
回溯法中的递归判断条件和变量要仔细考虑

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 50
int n,A[max]={1},B[max]={1},flag[max];//A为输出数组,B为判断素数数组,C为标志变量数组
void dfs(int i)
{
    int k,j;//注意每一次都会重新定义不要弄成全局变量
    if(i==n&&B[A[0]+A[n-1]])//这是最后一步同时清楚上界
      {

         for(k=0;k<n;k++) k ? printf(" %d",A[k]):printf("%d",A[k]);
         printf("\n");
      }
    else for(j=2;j<=n;j++)//1已经判断好了所以直接从2开始
    {
        if(!flag[j]&&B[j+A[i-1]])//标志数组:若此数字已排序则进入下一次循环//判断此数字和输出数组上一个的和是否为素数
        {
            flag[j]=1;//标记此数字
            A[i]=j;//进行排序
            dfs(i+1);//递归
            flag[j]=0;//跳到总循环这样才可以重新开始所以需注意
        }
    }
}
int  isprime(int l)//判断是否为素数
{
    int k;
    for(k=2;k<l/2;k++)
    {
        if(l%k==0) return 0;
    }
    return 1;
}
int main()
{
    int num=0;
    int l;
    for(l=2;l<=max;l++)
    {
        B[l]=1;
    }
    for(l=2;l<=max;l++)
    {
        if(!isprime(l))//对素数进行0-1规划,便于判断
        B[l]=0;
    }
    while(scanf("%d",&n)!=EOF)
    {
        if(num++)
        printf("\n");
        printf("Case %d:\n",num);
        dfs(1);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值