zoukankan      html  css  js  c++  java
  • 相邻数字相加为质数

    题意:

         

    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
    

     

     

     

    思路分析:

                 哈!DFS!

                 1、可以从第二个数开始放(题目要求第一个数为1),每次放一个数要跟前面的数相加,判断是否为质数。

               是:标记该数已经用过,可以继续往下放

               否:撤销标记,回溯上一个数

                2、判断越界:数字都用完了&&最后一个数跟第一个数相加也是一个质数

     

    源代码:

           

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 int n;
     5 int pri[11] = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 };    //质数表
     6 int ans[20];              //储存给的数
     7 int used[20];            //用来标记用过的数
     8 int is_pri(int a, int b)            //判断相加是否是质数
     9 {
    10     int w = 0;
    11     for (int i = 0; i < 10; i++)
    12     {
    13 
    14         if (a + b == pri[i])
    15             
    16         
    17             return 1;
    18     }
    19     return 0;
    20 }
    21 void dfs(int a)
    22 {
    23     
    24     if (a == n && is_pri(ans[0], ans[n - 1]))        //结束条件
    25     {
    26         for (int i = 0; i < n; i++)
    27         {
    28             
    29             if (i == n - 1)
    30             {
    31                 cout << ans[i];        //最后一个单独输出,要求格式。
    32                 break;
    33             }
    34             cout << ans[i] << " ";
    35         }cout << endl;
    36     }
    37     else
    38     
    39         for (int i = 2; i <= n; i++)
    40           if (!used[i] && is_pri(i, ans[a - 1]))
    41             {
    42                 used[i] = 1;            //该数已经使用
    43                 ans[a] = i;             //把i放进a位置
    44                 dfs(a + 1);
    45                 used[i] = 0;            //清除使用记录(不满足的数)
    46             }
    47 }
    48 int main()
    49 {
    50 
    51     memset(ans, 0, sizeof(ans));
    52     memset(used, 0, sizeof(used));
    53     ans[0] = 1;                       //题目要求,第一个数要为1.
    54     int count = 0,k=0;
    55     while (cin >> n)
    56     {
    57         if (k++)
    58             cout << endl;
    59         count++;
    60         if (n == 0)
    61             return 0;
    62         
    63         printf("Case %d:
    ", count);
    64         dfs(1);
    65         
    66     }
    67 
    68     return 0;
    69 }

    心得:

            瞬间发现DFS的题就是按照模板在做题。。。。嗯,细节还是要注意的!

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    cogs 826. [Tyvj Feb11] GF打dota 次短路详细原创讲解! dijkstra
    cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!
    cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树
    cogs 293. [NOI 2000] 单词查找树 Trie树字典树
    P4550 收集邮票
    P1850 换教室 期望dp
    洛谷 UVA11021 Tribles
    P3802 小魔女帕琪 概率与期望
    P3369 【模板】普通平衡树 01Trie树
    P2765 魔术球问题
  • 原文地址:https://www.cnblogs.com/Lynn0814/p/4690468.html
Copyright © 2011-2022 走看看