zoukankan      html  css  js  c++  java
  • 素数环

    Description

    A ring is composed of n (even number) circles as shown in diagram. Put natural numbers $1, 2, dots, n$ into each circle separately, and the sum of numbers in two adjacent circles should be a prime.


    Note: the number of first circle should always be 1.

    Input 

    n (0 < n <= 16)

    Output 

    The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements.


    You are to write a program that completes above process.

    Sample Input 

    6
    8
    

    Sample Output 

    Case 1:
    1 4 3 2 5 6
    1 6 5 2 3 4
    
    Case 2:
    1 2 3 8 5 6 7 4
    1 2 5 8 3 4 7 6
    1 4 7 6 5 8 3 2
    1 6 7 4 3 8 5 2
    

     因为起点已经确定为1;

    只要用dfs回溯就行;

    同是要注意使用vis[]数组判重;

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int is_prime(int x) {
     7   for(int i = 2; i*i <= x; i++)
     8     if(x % i == 0) return 0;
     9   return 1;
    10 }
    11 
    12 int n, A[50];
    13 bool isp[50],vis[50];
    14 void dfs(int cur) {
    15   if(cur == n && isp[A[0]+A[n-1]]){
    16     for(int i = 0; i < n; i++){
    17       if(i != 0) printf(" ");
    18       printf("%d", A[i]);
    19     }
    20     printf("
    ");
    21   }
    22   else for(int i = 2; i <= n; i++)
    23     if(!vis[i] && isp[i+A[cur-1]]){
    24       A[cur] = i;
    25       vis[i] = 1;
    26       dfs(cur+1);
    27       vis[i] = 0;
    28     }
    29 }
    30 
    31 int main() {
    32   int kase = 0;
    33   while(scanf("%d", &n) == 1 && n > 0){
    34     if(kase > 0) printf("
    ");
    35     printf("Case %d:
    ", ++kase);
    36     for(int i = 2; i <= n*2; i++) isp[i] = is_prime(i);
    37     memset(vis, 0, sizeof(vis));
    38     A[0] = 1;
    39     dfs(1);
    40   }
    41   return 0;
    42 }
    View Code
  • 相关阅读:
    Linux新手入门:通过chmod改变文件权限
    Android Activity 以及 Application 生命周期
    java 并发库之 Executors
    java Netty tcp通讯
    Android App 切换语言
    java svg转png
    高效的数独算法-位运算
    Android 高效的`InjectView – ButterKnife`
    Android 监听文件夹
    Android 更新UI
  • 原文地址:https://www.cnblogs.com/demodemo/p/4690596.html
Copyright © 2011-2022 走看看