zstu4028——DFS+回溯——素数和环

Description

把前n个正整数摆成1个环,如果环中所有相邻的2个数之和都是1个素数,该环称为1个n项素数和环。 输入1个整数n,输出共有多少种

Input

输入一个正整数n

Output

输出环的个数,要求环的第一个数字是1

Sample Input

4

Sample Output

2

HINT

大意:回溯,要会写dfs得到全排列

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 66666;
int vis[maxn];
int a[maxn];
void dfs(int step)
{
    if(step == n + 1){
        for(int i = 1; i <=  n; i++)
            printf("%d",a[i]);
            return ;
    }
    else {
        for(int i = 1; i <= n ; i++){
            if(!vis[i]){
                vis[i] = 1;
                a[step] = i;
                dfs(step+1);
                vis[i] = 0;
            }
        }
    }
}

 AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 666666;
int vis[maxn];
int n,cout;
int a[maxn];
int prim(int n){
    int i;
    for( i = 2; i*i <= n ;i++){
        if(n%i == 0)
            break;
    }
    if(i*i > n)
    return 1;
     return 0;
}
void dfs(int step)
{
    if(step == n+1){
        int i;
        //for(int j = 1; j <= n ;j++)
        //    printf("%d",a[j]);
        //    puts("");
        for( i = 1; i <= n ;i++){
            int x = a[i],y = a[i+1];
            if(i == n){
                y = a[1];
            }
            if(prim(x+y) == 0){
                break;
            }
        }
        if(i > n) {
        //for(int i = 1; i <= n ;i++)
        //    printf("%d",a[i]);
       // puts("");
       // printf("%d %d\n",a[4]+a[5],prim(a[4]+a[5]));
        cout++;
 
        }
    }
    for(int i = 2; i <= n ; i++){
        if(!vis[i]){
            vis[i] = 1;
            a[step] = i;
            dfs(step+1);
            vis[i] = 0;
        }
    }
}
int main()
{
    a[1] = 1;
    while(~scanf("%d",&n)){
        if(n%2 == 1)
            printf("0\n");
        else {
        cout = 0;
        dfs(2);
        printf("%d\n",cout);
        }
    }
    return 0;
}
 

  

转载于:https://www.cnblogs.com/zero-begin/p/4514972.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值