/*
问题:在给定的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;
}
/
机试算法讲解: 第44题 深度优先搜索之素数环问题
这篇博客介绍了一种使用深度优先搜索(DFS)解决机试算法问题的方法,特别是针对1到n的数字填充环形结构,要求相邻数字之和为素数。通过回溯法,从1开始尝试填充每个位置,判断相邻数字和是否为素数,如果无法满足条件则回溯更改。文章提供了C++代码实现,并展示了剪枝技巧。
摘要由CSDN通过智能技术生成