c语言素数环,回溯法——素数环C++实现

c语言素数环,回溯法——素数环C++实现本文共 928 个字 预计阅读时间需要 3 分钟 回溯法简介回溯法按深度优先策略搜索问题的解空间树 首先从根节点出发搜索解空间树 当算法搜索至解空间树的某一节点时 先利用剪枝函数判断该节点是否可行 即能得到问题的解 如果不可行 则跳过对该节点为根的子树的搜索 逐层向其祖先节点回溯 否则 进入该子树 继续按深度优先策略搜索 回溯法的基本行为是搜索 搜索过程使用剪枝函数来为了避免无效的搜索 剪枝函数包括两类

本文共928个字,预计阅读时间需要3分钟。

回溯法简介

回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。

回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:

使用约束函数,剪去不满足约束条件的路径;

使用限界函数,剪去不能得到最优解的路径。

问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。

素数环问题

Problem Description

A ring is compose of n circles as shown in diagram. Put natural number 1, 2, …, n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

000902881616fb2a052da1e7a9fb803c.png

Note: the number of first circle should always be 1.

Input

n (0 < n < 20).

Output

The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.

Sample Input

6 8

Sample Output

Case 1:

1 4 3 2 5 6

1 6 5 2 3 4

Case 2:

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

C++代码

#include

#include

using namespace std;

//Nmax = 17

//Prime Ring

int n;

int ans[22];

bool hashx[22];

int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41};

bool isPrime(int x){

for(int i = 0; i < 13; i++){

if(prime[i] == x)return true;

}

return false;

}

void checkAndPrint(){ //检查输出由回溯法枚举得到的解

if(! isPrime(ans[n] + ans[1]))return; //判断最后一个数与第一个数是否为素数,若不是则直接返回

for(int i = 1; i <= n; i++){

printf(“%d%s”, ans[i], i == n ? “\n” : ” “);

}

}

void DFS(int num){ //num为环中的个数

if(num > 1){

if(!isPrime(ans[num] + ans[num – 1]))return; //如果不是素数,则返回

}

if(num == n){

checkAndPrint(); //输出结果

return;

}

for(int i = 2; i <= n; i++){

if(!hashx[i]){ //没有被放入

hashx[i] =true;

ans[num + 1] = i;

DFS(num + 1); //继续尝试放入下一个

hashx[i] = false; //回溯后,重新标记为未使用

}

}

}

int main(){

int casex = 0;

while(cin>>n){

casex++;

for(int i = 0; i < 22; i++)hashx[i] = false;

ans[1] = 1;

printf(“Case %d:\n”, casex);

hashx[1] = true; //标记1已经被使用

DFS(1);

}

return 0;

}

更多内容访问 omegaxyz.com

网站所有代码采用Apache 2.0授权

网站文章采用知识共享许可协议BY-NC-SA4.0授权

© 2019 • OmegaXYZ-版权所有 转载请注明出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212929.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:55
下一篇 2026年3月18日 下午6:56


相关推荐

  • HTML添加背景图片_html背景图片铺满网页

    HTML添加背景图片_html背景图片铺满网页2020-04-27 每日一例第43天1.后台代码<html><center><head>0420html中div的用法</head>

    2022年8月4日
    7
  • mysql全文索引是什么_Mysql中的全文索引

    以前只是简单听说过Mysql有全文索引,但是一直没有认真去了解过。最近在《MYSQL必知必会》中学习到这个知识点,做下记录。首先,什么是全文索引?简单来说,全文索引其实就是类似于LIKE语句,把包含一定的字符串的的行记录挑选出来。那么问题来了,既然只是达到这个需求的话使用LIKE就行了,LIKE不行的话也还能使用正则表达式,为什么还要大费周章弄个全文索引出来呢?书上提到了三个原因:①性能,Like…

    2022年4月9日
    80
  • Python迭代器实现

    Python迭代器实现文章目录欢迎访问我的个人博客引言 iter 和 next 实现可迭代的斐波那契数列类参考欢迎访问我的个人博客博客引言在 Python 编程中 我们经常使用 for in 语句对容器进行迭代 容器类 比如列表 元组等 之所以可以被 for in 语句迭代 是因为这些容器类实现了 iter 魔术方法 这个方法返回一个迭代器对象 迭代器对象实现了 next 魔术方法 这个方法可以移动迭代器和获取迭代器指向的值 如果我们想要实现支持迭代的对象 只需要实现 iter 方法以及 iter 返

    2025年12月11日
    6
  • Android开源项目及库汇总

    Android开源项目及库汇总

    2021年10月1日
    35
  • 关联数据入门——RDF

    关联数据入门——RDF本文是语义网的入门级读本,试图描述一些语义网基本知识……

    2022年7月1日
    24
  • Python爬虫程序实例

    Python爬虫程序实例在这个爬虫程序中使用到“BeautifulSoup”与“requests”两个包,所以我们之前要安装这两个包,如果不清楚是否安装,可以使“piplist”查看是否已经安装。做“爬虫程序”时建议用谷歌浏览器对网页元素进行检查,在网页空白处右击鼠标在弹出菜单中,使用“检查”菜单项。在检查元素窗口中,在“Elements”窗口仔细查看网页元素,特别要观察所要截取的内容前后HTML元素的特征。在上述代码中:主要抓取中的元素,这里看到它们的class元素的名称都是“news_li_strong”,所以在代

    2022年6月17日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号