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;
}

  

时间: 2024-11-05 21:38:49

zstu4028——DFS+回溯——素数和环的相关文章

素数环(dfs+回溯)

题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 方法1:(生成测试法,会超时) #include <bits/stdc++.h>#define MAXN 100using namespace std; int isp[MAXN], a[MAXN]; void get_prime(void)          //*****素数打表{    m

CodeForces 550B Preparing Olympiad(DFS回溯)

[题目链接]:click here~~ [题目大意] 一组题目的数目(n<=15),每个题目有相应的难度,问你选择一定的题目(大于r个且小于l个)且选择后的题目里最小难度与最大难度差不小于x,求选择方案数. [解题思路]: DFS+回溯. 先发一发比较拙的代码: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; int num[N],mum[N]; int n,m,q,t,l,r; int top,ans,

HDU4499 Cannon DFS 回溯的应用

题意就是给你一个n*m的棋盘,然后上面已经有了 棋子,并给出这些棋子的坐标,但是这些棋子是死的就是不能动,然后让你在棋盘上面摆炮,但是炮之间不能互相吃,吃的规则我们斗懂得 炮隔山打嘛,问你最多能放几个炮 肯定是搜索了,n,m最大才5,可能挺久没做了,对于回溯反而把握不好了,写了好久调试了好久,才过 #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #

POJ2488-A Knight&#39;s Journey(DFS+回溯)

题目链接:http://poj.org/problem?id=2488 A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36695   Accepted: 12462 Description Background The knight is getting bored of seeing the same black and white squares again and again

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

poj1321——dfs回溯

POJ 1321  DFS回溯+递归枚举 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24813   Accepted: 12261 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行

hduoj2553——N皇后问题,dfs回溯

hduoj 2553  dfs,回溯 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10297    Accepted Submission(s): 4634 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的

hdu4499 Cannon (DFS+回溯)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4499 Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 363    Accepted Submission(s): 214 Problem Des

HDU 1015 dfs回溯

题目真长.....看了好长时间才看懂.. 就是给你一个32位数字和一个最多15个字符的字符串,从字符串中选出5个字符,若满足题中给的那个式子,输出字典序最大的那5个字符,若不满足,输出no solution. 为了解决字典序问题,在输入字符串后,把字符串按从大到小排一下序,搜索一下若满足条件输出即可. 贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <