【模板】回溯法 (八皇后、素数环题解)

算法设计与分析回溯算法之素数环问题 回溯算法素数环问题 问题描述 素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。 算法分析 【算法流程】 1、数据初始化; 2、递归填数:判断第i个数填入是否合法; A、如果合法:填数;判断是否到达目标(20个已填完): 是,打印结果;不是,递归填下一个;(剪枝条件) B、如果不合法:选择下一种可能; 代码 #include<cstdio> #include&lt... 阅读详情

回溯法

在问题的解空间树中,按深度优先策略从根结点出发搜索解空间树。算法搜索到解空间树任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树继续按照深度优先策略搜索。

两种剪枝策略

1. 用约束函数在扩展结点处减去不满足约束的子树。

2. 用限界函数剪去得不到最优解的子树。

伪代码模板

void dfs(int t)//t记录递归深度
{
    if(t>n) Output(x);//n控制递归深度
    else
        for(int i=f(n,t);i<=g(n,t);i++){//在当前扩展结点处未搜索过的子树的起始编号和终止编号
            x[t]=h(i);//h(i)表示当前扩展结点x[t]的第i个可选择的值
            if(Constraint(t)&&Bound(t)) dfs(t+1);
        }
}

子集树(如01背包问题)

void dfs(int t)
{
    if(t>n) output(x);
    else{
        for(int i=0;i<=1;i++){
            x[t]=i;
            if(Constraint(t)&&Bound(t)) dfs(t+1);
        }
    }
}

排列树(如TSP问题)

//在dfs(1)以前,需要先将变量数组x[]初始化为单位排列(1,2,3,……)
void dfs(int t)
{
    if(t>n) output(x);
    else{
        for(int i=t;i<=n;i++)
        {
            swap(x[t],x[i]);
            if(Constraint(t)&&Bound(t)) dfs(t+1);
            swap(x[t],x[i]);
        }
    }
}

八皇后

描述

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。

输入

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量

输出

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

样例

输入:8

输出:92

输入:5

输出:10

#include<iostream>
#include<cstring>
#include<cmath> 
using namespace std;
int pos[11];
int sum;
int n;
bool place(int k)
{
	for(int i=1;i<k;i++)
	{
		if(pos[i]==pos[k]||abs(i-k)==abs(pos[i]-pos[k])) return false;
	}
	return true;
}
void dfs(int t)
{
	if(t>n) sum++;//深度n+1时,说明到达叶子结点,是一个可选方案 
	else
	{
		for(int i=1;i<=n;i++)//相当于一个n叉树
		{
			pos[t]=i;// 放置棋子 
			if(place(t)) dfs(t+1);//检查落子合法性 
		 } 
	}
}
int main(void)
{
	while(cin>>n)
	{
		memset(pos,0,sizeof(pos));
		sum=0;
		dfs(1);
		cout<<sum<<endl;
	}
	return 0;
}

素数环

描述

素数环是像这样的一个图形,将1~N排列成一个环,让环中任意相邻两个数的和都是素数。如图就是一个简单的素数环:

    1

 /     \

6       4

|        |

5        3

 \      /

     2

注意,考虑到对称性,我们假设素数环的元素都是从1开始的。

输入

第一行为两个正整数 ,代表素数环中元素的个数。0<n<20。

输出

所有可能的素数环,按字典序从小到大输出。

输入

6

输出

1 4 3 2 5 6 
1 6 5 2 3 4

输入

8

输出

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

#include<iostream>
#include<cstring>
using namespace std;
int x[21];
bool mark[21];
int n;
bool prime(int num)
{
	int primeNum[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};
	for(int i=0;i<14;i++){
		if(primeNum[i]==num) return true;
	}
	return false;
}
void output()
{
	for(int i=1;i<=n;i++)
	{
		 if(i==1) cout<<x[i];
		 else printf(" %d",x[i]);
	}
	printf("\n");
}
void dfs(int t)
{
	if(t>n){
		if(prime(x[n]+x[1])==true) output();
		return;
 	}
 	else
 	{
 		for(int i=2;i<=n;i++)
 		{
 			if(mark[i]==true) continue;
 			x[t]=i;
 			mark[i]=true;
 			if(prime(x[t]+x[t-1])) dfs(t+1);
 			mark[i]=false;
		 }
	 }
}
int main(void)
{
	cin>>n; 
	memset(x,0,sizeof(x)); 
	for(int i=1;i<=n;i++){
		mark[i]=false;
	}
	x[1]=1;mark[1]=true;
	dfs(2);
	return 0;
 } 

 

2110:【例5.1】素数环 信息学奥赛一本通 搜索与回溯算法 排列成一个环,使得相邻两个整数之和均为素数。同时,环的首尾两个数字之和也必须是素数。 阅读详情

相关推荐

回溯解决素数环问题

问题描述 素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数 思路分析 我们可以根据问题建成一个根节点为1深度为n的n叉数。通过对解空间的进行回溯剪枝(条件就是相邻两元素和为素数以及是否重复使用)就可以得到所有解。 java实现 public class PrimeRing { protected int k, x[], count...

qq_42024777的博客 421

素数环

题目描述 输入一个正整数n,将从1到n这n个整数围成一个圆环,如果其中任意2个相邻的数字相加结果均为素数,那么这个环就称为素数环。 输入 输入一个正整数n,n<=16 输出 输出长度为n的素数环序列(可能的解有多个),要求从整数1开始逆时针排列,同一个环恰好输出一次。 样例输入 6 样例输出 1 4 3 2 5 6 1 6 5 2 3 4 思路: 回溯,一个个放入符合条件则输出,不符合则重新赋值,和一个原理 #include <stdio.h> int f(in

ChenJJJJJJJJ的博客 3739

lidar点云比赛-Southlidar软件使用入门

lidar点云比赛-Southlidar软件使用入门 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.09.29 一、软件资源及安装 1.下载地址: https://pan.baidu.com/s/1jN1pynmAZOqj5mMx774pVg 提取码:gkvv (资源来自南方测绘) 2.安装 进入链接,找到软件文件夹, 内含文件即为安装包 3.下载成功后按提示安装即可 4.安装成功后桌面自动创建一个快捷方式 二、界面布

qq_49621416的博客 4891

美丽的项链(素数环)(回溯法)

素数环,回溯法

weixin_53731572的博客 463

PuTTY使用方法

PuTTY是一款开源SSH/Telnet客户端,主要用于Windows系统连接Linux服务器。使用步骤包括:下载安装PuTTY,输入服务器IP和端口(默认22),可选择保存会话配置。支持密码和SSH密钥认证(需转换.pem为.ppk格式)。首次连接需确认主机密钥,成功登录后可执行Linux命令。其他功能包括会话日志记录、X11转发和端口隧道配置。操作完成后输入exit断开连接。

特网云计算 3152

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 294

acm算法总结——搜索

一.搜索算法的概念及其种类: 1.概念: 利用计算机的高效性,穷举出问题的部分或者所有的解,是求解问题的一种方法。本质上是通过初始条件扩展出问题的“解答树”,去寻找问题的解。构建这样的树形模型主要由两个部分——控制结构(扩展节点的方式)和产生系统(扩展节点)。通过对每个节点不同方式的拓展去寻找目标解。 2.种类: 深度优先搜索(DFS) 广度优先搜索(BFS) 二分搜索 散列法(Hash) ...

qq_43597036的博客 939

芯片详解——AD7606

AD7606详解

weixin_45661757的博客 5019

ACM素数环问题(c++和python3)

素数环是一个由数字 1, 2, ..., n 构成的圆环,其中任意两个相邻数字之和均为素数,圆环中的数字不能重复。 - Input: 输入包含多组测试数据,每组数据占一行,为素数环的大小 n (0 < n < 18)。 - Output: 对于每组数据,按字典序大小,输出所有素数环的排列方案,排列方案的第一个数字必须是 1,每组数据后要输出一个空行。

qq_33163046的博客 6733

UNet改进(12):融合小波变换与注意力机制的图像分割新方法

本文提出了一种改进的WaveletAttentionUNet架构,通过结合小波变换和注意力机制来增强传统UNet的多尺度特征提取能力。该网络使用分组卷积模拟小波分解,将输入通道扩展为4个子带(LL、LH、HL、HH),并通过通道注意力机制自适应加权各子带特征。网络保留了UNet的编码器-解码器结构,在关键位置集成了WaveletAttention模块。实验证明该方法在医学图像分割等任务中能更好地保持边缘细节和复杂纹理特征,同时保持计算效率。

2501_91516851的博客 758

Alist/Openlist 的 WebDAV 老是连不上?别再乱试了,这才是标准答案!(1Panel如何使用Alist/Openlist作为备份账号)

😫服务器硬盘告急,想用 Alist/Openlist 的 WebDAV 备份却屡屡失败?别慌!本文带你揭秘正确的连接地址和权限配置,手把手教你搞定 1Panel 备份设置,让你的网盘秒变备份仓库!

XiaoqiangClub的博客 5578

【基础算法】素数环

题目描述 输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和均为素数。小强同学看过这个题,笑了:呵呵,打表! Mr. Wu为了阻止小强打表,决定这样: 把全部的解按字典序排序后,从1开始编号,依次输出指定编号的k组解。最后一行输出总的方案数。同一个素数环只算一次。 输入 第1行:2个整数,n(n 第2行:共有k个从小到大排列的整数,表示要输出的解的编号。

little_qiao的博客 4689

【华为机试真题 Python实现】分苹果

《华为机试真题》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!本文解法非最优解(即非性能最优)。A,B两个人把苹果分为两堆,A希望按照它的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算走位,12+5=9(1100+0101=9), B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多,输入苹果的数量和每个苹果重量,输出满足A的情况下获取的苹果总重量, 如果无法满足A的要

3412

回溯法(简单例子)素数环问题

素数环问题

weixin_45939614的博客 304

华为OD机试新系统真题-魔法咒语组合(Java/Py/C++/Go/C/Js)

华为OD机试 新系统真题【魔法咒语组合】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【魔法咒语组合】多语言题解

qq_45776114的博客 667

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NYOJ 488 dfs

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。 为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。 输入 有多组测试数据,每组输入一个n(0 输出 每组第一行输出对应的

2660

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【DFS练习】素数环

DFS+回溯+剪枝,同时用空间换时间。

z135733的博客 3257

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

素数环(深度优先,回溯,排列树)

问题对于n个1到n的数,素数环的定义是这n个数围成一个圈,每相邻的两个数不能相等且。相邻的两个数相加必须是一个素数;求组成不同素数环的方案数。solution1深度优先搜索,回溯法。solution3排列树进行回溯;...

qq_51825761的博客 1421

素数环(1-20)

题目要求:将1,2,3,…,20这20个数围成一圈,使相邻的两数之和均为素数。 思考: 这样的环显然不止一种,如果要输出所有环,那么就要按照一定顺序,一定原则来输出。 为了方便思考,不妨就假设第一个元素为1,能与1相邻且和为素数的有2,4,10,12,16; 如果将2放置在1之后,紧接着要寻找能与2相邻且和为素数的数,这与前面的步骤相仿,显然可以用递归来实现,而且这种逻辑与图的深度优先遍历不谋而合。 假如1,2的顺序已经遍历完了,那么紧接着要遍历1,4,这就要想到2遍历完之后要回到起点1,这就是回溯的思想了

weixin_45461609的博客 3429

素数环——c++

将从1到n,n个整数摆成一个环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。一行一个整数 n,代表有多少个数字。

wjy20140509的博客 1383

素数环(递归 搜索 回溯)

素数环:从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。 分析:首先设有20个空位,填进20个数,可以填数的条件是这个数在之前没有出现过,并且与它的前一个数的和是 一个素数;注意第二十个数时还要判断与第一个数的和是否是一个素数。若满足条件,填数,否则填下一个数; 代码如下: #include<iostream>#include<cstdio&gt...

weixin_30242907的博客 679

回溯算法以及其模板

常见算法回溯算法解决什么问题怎么理解回溯算法回溯算法模板 回溯算法 解决什么问题 回溯算法适用于以下的场景。 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等等 怎么理解回溯算法 我们可以把回溯算法理解成一个二叉树。 回溯算法模板 回溯函数模板返回值以及参数 -void backtracking(参数) 回溯函数终止条件 只要像是递

m0_57315623的博客 2976

算法整理八——回溯算法

概述 以深度优先的方式系统地搜索问题的解的方法称为回溯法。 回溯算法是深度优先策略的典型应用,回溯算法就是沿着一条路向下走,如果此路不通了,则回溯到上一个分岔路,再选一条路走,一直这样递归下去,直到遍历完所有的路径。 回溯算法的解空间结构可以组成成子集树(0-1背包问题、全排列)、排列树。会画出解决某个问题的解空间树,比如会画出描述3个物品的背包问题的解空间树等 旅行商问题就是一颗排列数 4.使用回溯法解题,通常包括的三个步骤 (1)针对所给问题,定义问题的解空间; ..

weixin_45901806的博客 7648

素数环(回溯算法)

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

zhe___的博客 5258
上一篇: 【模板】动态规划之最长上升子序列LIS问题、概率DP问题 (烟花题解)
下一篇: 【SOJ】超大背包 (回溯法经典应用)
coderwait
博客等级 码龄9年 20粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值