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

    题目描述:

      输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数。输出时从整数1开始逆时针排列并且不能重复;

      例样输入:

      6

      例样输出:

      1 4 3 2 5 6

      1 6 5 2 3 4

    方法1:(生成测试法,会超时)

     1 #include <bits/stdc++.h>
     2 #define MAXN 100
     3 using namespace std;
     4 
     5 int isp[MAXN], a[MAXN];
     6 
     7 void get_prime(void)          //*****素数打表
     8 {
     9     memset(isp, 1, sizeof(isp));
    10     isp[0]=isp[1]=0;
    11     for(int i=2; i<MAXN; i++)
    12     {
    13         if(isp[i])
    14         {
    15             for(int j=2; j*i<MAXN; j++)
    16             {
    17                 isp[i*j]=0;
    18             }
    19         }
    20     }
    21 }
    22 
    23 int main(void)
    24 {
    25     std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    26     get_prime();
    27     int n;
    28     cin >> n;
    29     for(int i=0; i<n; i++)
    30     {
    31         a[i]=i+1;
    32     }
    33     do
    34     {
    35         int flag=1;
    36         for(int i=0; i<n; i++)  //****逐个尝试
    37         {
    38             if(!isp[a[i]+a[(i+1)%n]])    //****判断合法性
    39             {
    40                 flag=0;
    41                 break;
    42             }
    43         }
    44         if(flag)     //****如果合法则输出序列
    45         {
    46             for(int i=0; i<n; i++)
    47             {
    48                 cout << a[i] << " ";
    49             }
    50             cout << endl;
    51         }
    52     }while(next_permutation(a+1, a+n));  //***1的位置不变
    53     return 0;
    54 }



    方法2:(dfs+回溯)

    代码:

     1 #include <bits/stdc++.h>
     2 #define MAXN 100
     3 using namespace std;
     4 
     5 int isp[MAXN], a[MAXN], vis[MAXN], n;
     6 
     7 void get_prime(void)  //****素数打表
     8 {
     9     memset(isp, 1, sizeof(isp));
    10     isp[0]=isp[1]=0;
    11     for(int i=2; i<MAXN; i++)
    12     {
    13         if(isp[i])
    14         {
    15             for(int j=2; i*j<MAXN; i++)
    16             {
    17                 isp[i*j]=0;
    18             }
    19         }
    20     }
    21 }
    22 
    23 void dfs(int cur)
    24 {
    25     if(cur==n && isp[a[0]+a[cur-1]])  //****递归边界
    26     {
    27         for(int i=0; i<n; i++)      //***打印合法序列
    28         cout << a[i] << " ";
    29         cout << endl;
    30     }
    31     else
    32     {
    33         for(int i=0; i<n; i++)   //***逐个尝试
    34         {
    35             if(!vis[i]&&isp[i+a[cur-1]])  //***i没用过且满足条件
    36             {
    37                 a[cur]=i;    //***存储当前序列
    38                 vis[i]=1;    //****标记
    39                 dfs(cur+1);   //***递归
    40                 vis[i]=0;    //***去除标记
    41             }
    42         }
    43     }
    44 }
    45 
    46 int main(void)
    47 {
    48     std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    49     get_prime();
    50     cin >> n;
    51     memset(vis, 0, sizeof(vis));
    52     dfs(0);
    53     return 0;
    54 }



  • 相关阅读:
    要开学了,暂时停更
    day13 IP包头分析 | 路由器原理 1
    day12 数据链路层 | 交换机基本命令
    day11 OSI与TCP-IP 5层协议 | 物理层相关知识
    day10 扫描与爆破
    day 09 简单渗透测试
    day07 PKI
    day07 域
    day06 WEB服务器 | FTP服务器
    day05 DHCP部署与安全 | DNS部署与安全
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5850706.html
Copyright © 2011-2022 走看看