zoukankan      html  css  js  c++  java
  • 素数环(回溯)

    转载请注明出处

    题目描述

    把1~N这N个整数摆成一个环,要求任意相邻两个数的和为素数。按字典序打印出以1开始的素数环

    Input

    一个整数N (<=10)

    Output

    每行一个素数环。每个数之间用一个空格隔开。 
    无解输出 No Solution 

    Sample Input

    【样例输入1】
    4
    
    【样例输入2】
    3

    Sample Output

    【样例输出1】
    1 2 3 4
    1 4 3 2
    
    【样例输出2】
    No Solution 

    Hint

    为什么只要求以1开始的解。只有以1开始会漏掉其他可能的解吗? 
    优化:思考有哪些操作是不断要重复进行的,怎么优化。如何提高剪枝效率。
     1 /**
     2     回溯法
     3     网址:http://www.codeup.cn/problem.php?id=2908
     4     题目:2908: 素数环PrimeRing [3*]
     5     Accept
     6 */
     7 
     8 #include <stdio.h>
     9 
    10 int flag[15];
    11 int result[15];
    12 int stack[15],top = 0;
    13 int N;
    14 int haveResult;
    15 
    16 int isprime(int n){
    17     for(int i = 2; i <= n / 2; i++){
    18         if(n % i == 0)
    19             return 0;
    20     }
    21     return 1;
    22 }
    23 
    24 void print(){
    25     int i;
    26     for(i = 0; i < N - 1; i++){
    27         printf("%d ",result[i]);
    28     }
    29     printf("%d
    ",result[i]);
    30 }
    31 
    32 void primeCircle(int cur){///cur将要填写的位置
    33 
    34     if(cur == N){
    35         print();
    36         haveResult = 1;
    37         return ;
    38     }
    39 
    40     for(int i = 2; i <= N; i++){///遍历每一个可填数字
    41         if(flag[i - 1] == 0 && isprime(result[cur - 1] + i)){
    42             ///最后一个数字与第一个数字1的和不是质数
    43             if(cur == N - 1 && !isprime(i + 1)){
    44                 break;
    45             }
    46             result[cur] = i;
    47             flag[i - 1] = 1;
    48             primeCircle(cur + 1);
    49             ///返回上一层时,当前位置设置为未入选
    50             if(flag[result[cur] - 1] == 1){
    51                 flag[result[cur] - 1] = 0;
    52             }
    53         }
    54     }
    55 }
    56 
    57 int main(void){
    58     result[0] = 1;
    59     flag[0] = 1;
    60     stack[top++] = 1;
    61 
    62     while(scanf("%d",&N) != EOF){
    63         haveResult = 0;
    64         primeCircle(1);
    65         if(haveResult == 0)
    66             printf("No Solution
    ");
    67     }
    68 
    69     return 0;
    70 }
  • 相关阅读:
    rabbitmq在ios中实战采坑
    网络七层架构一句话简述
    HystrixCommand实战
    前端SEO技巧
    前端面试-难点问题2-java和javascript的区别
    前端面试题--难点问题
    [微信营销企划之路]003.Access forbidden!
    [Python进阶]001.不定参数
    [安卓基础]011存储数据(中)——sqlite语法介绍
    [JavaWeb基础] 015.Struts2 表单验证框架
  • 原文地址:https://www.cnblogs.com/yfs123456/p/5402534.html
Copyright © 2011-2022 走看看