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的题就是按照模板在做题。。。。嗯,细节还是要注意的!

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/Lynn0814/p/4690468.html
Copyright © 2011-2022 走看看