素数环(回溯算法)

2023-11-10

在这里插入图片描述
**回溯算法:**在包含问题的所有可能解的解空间树中,从根节点出发,按照深度优先遍历的策略进行搜索,对于解空间树种的某个节点,如果该节点满足问题的约束条件,则进入该子树继续进行搜索,否则将以该节点为根节点的子树进行剪枝。回溯法常常可以避免所有的可能解,所以,适用于求解组合数中较大的问题。回溯法从解空间树的根节点出发,按照深度优先遍历策略搜索满足约束条件的解。在搜索至树种某节点时,先判断该节点对应的部分是否满足约束条件.也就是判断该节点是否包含问题的(最优)解,如果肯定不包含,则跳过该节点为跟的子树,即所谓剪枝;否则,进入以该节点为跟的子树,继续按照深度优先遍历策略进行搜索。

设计

  1. 这个素数环有20个位置,每个位置可以填写1~20的整数,可以对每个位置从1搜索
  2. 约束条件:(1)与前面已经填写的数不重复
    (2)与前一个数的和为素数
    (3)最后一个数与第一个数的和为素数
  3. 在填写第k个位置时,如果满足约束条件,则继续填写k+1个位置;如果1~20都不满足,就回溯到k+1个位置,从原来填写的数+1开始检查

代码:

#include <iostream>
#include<math.h>
using namespace std; 

/*
约束条件:(1)与已经填写的数不重复
		 (2)与前一个数的和是素数
		 (3)最后一个数与第一个数的和是素数 
*/

bool isPrime(int x);
void Backtracking(int n);
bool check(int t);
static int n=20;
int arr[20];

int main() 
{
	
	Backtracking(20);
	return 0;
}

void Backtracking(int n)
{
	
	for(int i=0;i<n;i++)//将数组每个数初始化为0
	{
		arr[i]=0;
	}
	
	int k=1;
	arr[0]=1;//将第一个位置置为1,素数环从1开始
	while(k>=1)
	{	
		arr[k]+=1;
		
		while(arr[k]<n)//填写第k个位置
		{
			if(check(k)==1)
			{
				break;
			}
			else
			{
				arr[k]+=1;
			}
		}
		
		if(arr[k]<=n&&k==n-1)//求解完,输出 
		{
			cout<<"素数环为:"; 
			for(int i=0;i<n;i++)
			{
				cout<<arr[i]<<"  "; 
			}
			return;
			
		}
		
		if(arr[k]<=n&&k<n-1)//第k个位置填写完,继续填写第K+1个位置
		{
			k+=1;
		} 
		else
		{
			k--; //回溯到K-1个位置
			arr[k]+=1;//从原来填写的数+1开始
		}
	}
}




//检查当前选择的数与前面选的数是否重复,并且判断是否与前一个数的和为素数 
bool check(int t)
{	

	bool flag; 
	for(int i=0;i<t;i++)
	{
		if(arr[i]==arr[t])
		{
			return 0;
		}
	}
	
	flag=isPrime((arr[t]+arr[t-1]));
	if(flag&&t==n-1)//最后一个数与第一个数的和为素数
	{
		flag=isPrime((arr[1]+arr[n-1]));
	}
	
	return flag;
}

bool isPrime(int x)//判断一个数是否是素数 
{
	int k= (int)sqrt(x);
	for(int i=2;i<=k;i++)
	{
		if(x%i==0)
		{
			return false;
		}
	}
	return true;
}

结果
在这里插入图片描述

分析
n个位置,每个位置可以填写的情况有n种,因此素数环问题的解空间是一颗完全n叉树,树的深度2为n,
最坏情况下的时间复杂度为O(n^n)

总结:
通过本次实验加深了我对回溯算法所给的模式的理解,同时对用回溯算法解决一个实际问题有了一个更深层次的认识。回溯算法非递归的模式通用,用它解决一个问题的关键是找出合法解与部分解.的判断条件,在合法解时书写相应程序段,在部分解时书写相应程序段。另外注意有些条件部分解和合法解都要满足,此时要排除掉非法解,即要给它剪去。另外需要注意的是回溯的过程。总之,通过本次实验使我掌握了回溯算法非递归的一般模式,以后在解决一类问题时可以照着这个模式编写程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

素数环(回溯算法) 的相关文章

随机推荐

  • Windows下,Eclipse的Android NDK(r8e) 配置

    一 关于NDK Android NDK全称 Native Development Kit 即本地开发包 1 NDK是一系列工具的集合 NDK提供了一系列的工具 这些工具对开发者的帮助是巨大的 它们能帮助开发者快速开发C 或C 的动态库 并能
  • windows怎么部署项目到云服务器

    要将项目部署到云服务器 可以按照以下步骤进行操作 1 在云服务提供商上创建一个云服务器实例 并确保已经将其配置和启动 2 在本地开发环境中将项目打包成可执行文件或者jar包 并确保项目能够正确运行 3 使用远程连接工具 如SSH RDP等
  • ctfshow萌新web17

    c传参过滤掉php 思路 include文件包含 利用日志文件包含 访问日志文件 c var log nginx access log 发现日志文件记录了user agent头 于是在该头中插入一句话木马 再访问日志文件 看日
  • AMBA总线协议AHB、APB、AXI对比分析

    一 AMBA概述 AMBA Advanced Microcontroller Bus Architecture 高级处理器总线架构 AHB Advanced High performance Bus 高级高性能总线 ASB Advanced
  • Uniapp中vueX实现登录状态功能

    uniapp使用Vuex实现登录状态的判断 退出登录 使用action commit实现登录功能 Vue use Vuex export default new Vuex Store state token userid username
  • 了解CMS(Concurrent Mark-Sweep)垃圾回收器

    原文地址为 了解CMS Concurrent Mark Sweep 垃圾回收器 一字不差的贴的人家的 就是感觉写的比较好 贴出来了 羞羞 1 总体介绍 CMS Concurrent Mark Sweep 是以牺牲吞吐量为代价来获得最短回收停
  • 使用git和maven过程一些命令

    git常用命令 1 git status 查看文件在工作目录与缓存的状态 2 git add 添加所有的文件到缓存 3 git commit m 提交的描述信息 如果我们这里不用 m参数的话 git将调到一个文本编译器 通常是vim 来让你
  • mysql5.7 leftjoin group by(获取关联表最新数据)

    用户表 users 日志表 logs 外键 user id 创建时间 created at 获取所有用户最新的日志 SELECT b from SELECT user id max created at as maxtime from lo
  • nafxcwd.lib(afxmem.obj) error lnk2005

    最近写程序突然遇到个错误 nafxcwd lib afxmem obj error lnk2005 查了下msdn发现主要原因是同时使用了CRT中的new delete和MFC中的new delete重载导致的 参考 http suppor
  • RabbitMq基本概念 = >实践DirectExchange和TopicExchange交换机模式

    AMQP 和IM的区别 AMQP 高级消息队列 1 可以一对多广播 也可以一对一广播 2 生产者和消费者不知道对方是谁 IM 1 只能一对一广播 2 生产者和消费者知道对方是谁 RabbitMQ 只是消息代理 我们不生产消息 我们只是消息的
  • 怎样成为一名优秀的程序员?

    新加坡国立大学计算机系有两门课 CS 1101 1102 几乎所有的大学计算机系课程都有两门类似的课程 但几乎所有的学生都误解了这两门课 以为前者是教C 后者是教java 但实际上前者是 Programming Methodology 后者
  • Java学习笔记——34多线程01

    多线程 实现多线程 进程和线程的区别 多线程的实现方式 方式一 继承Thread类 设置线程名称 线程调度 线程控制 线程生命周期 方式二 实现Runnable接口 实现多线程 进程和线程的区别 进程 是正在运行的程序 是系统进行资源分配和
  • Netstat命令详解(Windows)

    Netstat 用于显示与IP TCP UDP 和ICMP 协议相关的统计数据 一般用于检验本机各端口的网络连接情况 如果你的计算机有时候接收到的数据报导致出错数据或故障 你不必感到奇怪 TCP IP 可以容许这些类型的错误 并能够自动重发
  • Kotlin/Java之常用“集合型”数据类型

    先说说数组 Array 和 ArrayList lt 数组 Array gt 整型数组初始化 val point intArrayOf 0 0 实为IntArray 对应Java类型 int 其他还有 charArrayOf byteArr
  • 两数求和

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 11 1
  • 服务器租用机房机房的类型应该如何选择

    服务器租用机房机房的类型应该如何选择 1 单电信机房 单电信服务器机房业务模式比较固定 访问量也不是很大 适合新闻类网站或政务类网站 如果网站的PV流量持续增加 建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题 2 双线机房
  • QKL123区块链排行榜(2019年04月)

    QKL123区块链排行榜包括区块链项目 区块链交易平台 区块链媒体 区块链公众号 区块链矿机 区块链矿池 EOS Dapp ETH Dapp 区块链钱包九大榜单 目前 区块链项目榜单选取的客观指标包括流通市值 GitHub提交数 区块链交易
  • 嵌入式stm32基础项目开发:心率检测仪的设计与实现

    嵌入式stm32基础项目开发 心率检测仪的设计与实现 本教程主要给大家谅解了嵌入式stm32开发 心率检测仪的设计与实现 需要的朋友们可以下载来看看 作为参考 项目描述 通过心律传感器采集我们的心律数据 然后通过串口传送到上位机中 上位机用
  • 这篇文章教大家怎么生成ai图片

    在数字化时代 人工智能技术的发展正在改变我们的生活方式 其中之一就是在艺术领域的应用 ai绘画是人工智能技术在艺术领域的一种应用 它可以自动创作出各种各样的图片 为艺术家和设计师提供了更加便捷和高效的绘画工具 ai绘画的出现 不仅可以缩短绘
  • 素数环(回溯算法)

    回溯算法 在包含问题的所有可能解的解空间树中 从根节点出发 按照深度优先遍历的策略进行搜索 对于解空间树种的某个节点 如果该节点满足问题的约束条件 则进入该子树继续进行搜索 否则将以该节点为根节点的子树进行剪枝 回溯法常常可以避免所有的可能