机试算法讲解: 第44题 深度优先搜索之素数环问题

这篇博客介绍了一种使用深度优先搜索(DFS)解决机试算法问题的方法,特别是针对1到n的数字填充环形结构,要求相邻数字之和为素数。通过回溯法,从1开始尝试填充每个位置,判断相邻数字和是否为素数,如果无法满足条件则回溯更改。文章提供了C++代码实现,并展示了剪枝技巧。
摘要由CSDN通过智能技术生成
/*
问题:在给定的1到n的数字中,将数字填入环中,使得环中任意2个相邻的数字和为素数。按字典序输出所有符合条件的解
回溯法:枚举每一个值,第一个放1时,尝试放入第二个数字,使其和1的和为素数,放入后再尝试第三个数,使其与第二个数的和为素数。直到所有数被全部放入环中,
       且最后一个数与1的和也是素数。
	   若发现当前位置无论放置任何之前未被使用的数均不能满足条件,回溯改变上一个数。
输入:n(1<n<17)
输入:
6
8
输出
case1
1 4 3 2 5 6
1 6 5 2 3 4
case2
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

关键:
1 对于其余情况,首先要判断当前的数字是否在环中,若不在环中,先标记为已用,并尝试设置第num+1个数字在ans数组中,然后继续尝试放入下一个数字,最后再将该数字
  重新标记为未使用
2 注意剪枝的基本过程:初始化剪枝标记,初始化节点,放入循环中
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 17

//用于判定两个数的和是否为素数。
int prime[13] = {2,3,5,7,11,13,17,19,23,29,31,37,41};
//用于存放所有数的和
int ans[N];
bool mark[N];//剪枝标记

//判断一个数是否为素数
bool judge(int x)
{
	//判断一个数是否为素数
	for(int i = 0 ; i < 13 ; i++)
	{
		if(x==prime[i])
		{
			return true;
		}
	}
	return false;
}

/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值