回溯法实现素数环和困难的串问题

#include <iostream>
using namespace std;


//用回溯法实现素数环 
//输入正整数n把整数1,2,3...n组成一个环,使得相邻两个整数之和均为素数,
//输出时从整数1开始逆时针排序,同一个环应恰好输出一次。
// n <= 16 
const int n = 6;
int vis[n+1] = {0};   //被访问过则为1没有被访问过为0
int A[n];   //储存数的放法 
int isp[n*2] = {0};
void dfs(int cur)
{
    //递归边界,记得要判断第一个数和最后一个数是否满足要求
    if(cur == n && isp[A[0] + A[n-1]])
    {
        for(int i = 0; i < n; i++)
        cout << A[i];
        cout << endl;
    }
    else for(int i = 2; i <= n; i++)   //放置每一个数字
        if(!vis[i] && isp[i+A[cur-1]])  //如果i没有用过,并且与之前的一个数的和为素数 
        {
            A[cur] = i;
            vis[i] = 1;   //设置使用标志
            dfs(cur+1);   //放下一个数 
            vis[i] &#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯法是一种解决问题的通用算法,可以用来解决许多组合优化问题素数问题就是其中一种。下面是素数问题的伪代码以及代码设计过程: ## 素数问题伪代码 ```text function find_primes(n): primes = [] for i from 2 to n: if is_prime(i): primes.append(i) return primes function is_prime(n): if n < 2: return False for i from 2 to sqrt(n): if n % i == 0: return False return True function prime_ring(n): primes = find_primes(n) ring = [0] * n # 初始化 ring[0] = 1 # 确定第一个位置为1 used = [False] * n # 初始化已使用数组 used[0] = True # 第一个位置已使用 search(primes, ring, used, n, 1) # 从第二个位置开始搜索 function search(primes, ring, used, n, index): if index == n: # 如果找到一个解,则输出 if is_prime(ring[0] + ring[-1]): # 检查首尾是否相邻 print(ring) else: for i in range(1, n): if not used[i] and is_prime(primes[i] + ring[index - 1]): ring[index] = primes[i] # 将素数加入中 used[i] = True # 标记已使用 search(primes, ring, used, n, index + 1) # 继续搜索 used[i] = False # 回溯,标记为未使用 ``` ## 代码设计过程 素数问题的目标是在 $1$ 到 $n$ 之间找到一组数组成,使得相邻两个数之和为素数。首先我们需要找到 $1$ 到 $n$ 之间的所有素数,这可以通过一个 `find_primes` 函数来完成。这个函数会遍历 $2$ 到 $n$ 之间的所有数,检查它们是否为素数,并将素数存储在一个列表中返回。 接下来,我们需要一个函数来判断一个数是否为素数,这可以通过一个 `is_prime` 函数来完成。这个函数会遍历 $2$ 到 $\sqrt{n}$ 之间的所有数,检查它们是否为 $n$ 的因子。如果找到了一个因子,那么 $n$ 不是素数,否则 $n$ 是素数。 有了素数列表之后,我们可以开始搜索素数。我们需要一个长度为 $n$ 的数组来存储中的素数,并且需要一个与之对应的布尔数组来记录哪些素数已经被使用过了。我们首先将第一个位置设置为 $1$,因为是循的,所以第一个位置的值没有影响。接下来,我们从第二个位置开始搜索,对于每个位置,我们需要遍历素数列表,找到一个没有被使用的素数,使得它和前一个位置的素数之和为素数。如果找到了这样的素数,我们将它加入中,标记为已使用,然后递归搜索下一个位置。如果在某个位置上找不到合适的素数,则回溯到上一个位置,并且把该位置的素数标记为未使用。 最后,如果找到了一个完整的素数,我们还需要检查第一个素数和最后一个素数之和是否为素数。如果是素数,则输出这个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值