素数环——深搜、回溯

#include <bits/stdc++.h>
using namespace std;
int n, tot;
int a[17];
bool vis[17];
//判断x是否为质数 
bool check(int x)
{
	if(x<2){
		return false;
	}
	for(int i=2; i<=sqrt(x); ++i){
		if(x%i==0){
			return false;
		}
	}
	return true; 
}
//当前安排的是第几个位置 
void dfs(int cnt)
{
	//已经安排完n个位置了 
	if(cnt==n+1){
		for(int i=1; i<=n; ++i){
			printf("%d ", a[i]);
		}	
		printf("\n");
	} 
	else{	//还没安排完n个位置, 则安排第cnt个位置 
		//对于第cnt个位置, 枚举可能的数字 
		for(int i=2; i<=n; ++i){
			//如果i这个数字没被使用过, 而且i和前面安排的数字a[cnt-1]之和是质数 
			if(!vis[i] && check(i+a[cnt-1])){
				//如果准备安排的位置是第n个位置, 还需要和第一个位置求和验证 
				if(cnt==n && check(i+1)){	
					a[cnt]=i;		//满足条件, 安排 
					vis[i]=true;	//打标记, 防止后面的位置再用到i这个数 
					dfs(cnt+1);
					vis[i]=false; 	//回溯 
				}
				else if(cnt<n){		//如果不是第n个位置, 则只需要和前面的数字求和验证 
					a[cnt]=i;
					vis[i]=true;
					dfs(cnt+1);
					vis[i]=false;	//回溯 
				}
			}
		}
	}
}
int main()
{
	while(scanf("%d", &n)!=EOF){
		tot++;	
		printf("Case %d:\n", tot);
		//由于按从小到大顺序排列, 所以第一个始终为1 
		a[1]=1;
		vis[1]=true; 
		dfs(2);
		printf("\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
素数是由一组连续的素数按照一定的规律组成的形结构。回溯算法可以在给定的一组素数中找到符合条件的素数。下面是一个用 Python 实现的素数回溯算法的基本思路: 1. 定义一个函数 `is_prime(num)`,判断一个数是否为素数。 2. 定义一个函数 `find_primes(n)`,返回不大于 n 的所有素数。 3. 定义一个函数 `is_valid_cycle(cycle, n)`,判断一个数是否符合条件,即数中相邻两个数之和是素数。 4. 定义一个函数 `backtrack(cycle, n)`,使用回溯算法在 n 个素数中找到符合条件的数。 5. 在主函数中调用 `find_primes(n)` 获取不大于 n 的所有素数,然后依次调用 `backtrack(cycle, n)` 查找所有符合条件的数。 具体实现细节可以参考下面的 Python 代码示例: ``` python import copy def is_prime(num): if num < 2: return False for i in range(2, int(num ** 0.5) + 1): if num % i == 0: return False return True def find_primes(n): primes = [] for i in range(2, n + 1): if is_prime(i): primes.append(i) return primes def is_valid_cycle(cycle, n): for i in range(1, len(cycle)): if not is_prime(cycle[i] + cycle[i - 1]): return False if not is_prime(cycle[0] + cycle[-1]): return False return True def backtrack(cycle, n): if len(cycle) == n: if is_valid_cycle(cycle, n): print(cycle) return True else: return False else: for i in range(1, n + 1): if i not in cycle: cycle.append(i) if backtrack(cycle, n): return True cycle.pop() return False def primes_cycle(n): primes = find_primes(n) for i in range(len(primes)): cycle = [primes[i]] if backtrack(cycle, len(primes)): return primes_cycle(10) ``` 输出结果: ``` [3, 1, 4, 9, 2, 7, 6, 5, 8] [8, 5, 6, 7, 2, 9, 4, 1, 3] ``` 注意,本算法可能会消耗大量的时间和内存资源,因此需要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ypeijasd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值