回溯法之素数环问题

问题描述:
输入正整数n,把整数1, 2, 3,…, n组成一个环,使得相邻两个整数之和均为素数。 输出
时从整数1开始逆时针排列。 同一个环应恰好输出一次。 n≤16

样例输入:

6

样例输出:

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

先不急这如何解决这道题,首先了解下字典排序。
这篇文章不采用递归回溯进行字典排序: https://blog.csdn.net/qq_34672688/article/details/79557380  
下面采用递归回溯法进行字典排序:

思路:采用递推,若条件符合则进入下一层,否则回溯并进行下一个节点的判断。
举个例子:先开始进行第一层的判断,符合进入第二层,......,知道进入第n层,遇到递归出口输出打印符合条件的值。接着回溯,进入第n-1层继续判断。那么字典排序是从1-n的排序,使用一个标记数组mark[]标记1-n这n个数中有那些数已经被使用,那些未被使用。未被使用的那些数则可以符合条件进入下一层递归,直到遍历所有可能。下面这张图展示递归如何进行字典排序,如下图所示: 回溯法之素数环问题_第1张图片

C语言代码如下:

#include 
#define maxsize 16
void dfs( int* arr, int n,int length);
int mark[maxsize+1]={0};//定义及初始化标记数组 
int main()
{
	int arr[16]={0};	//定义一个数组 
	dfs(arr,0,15);   
	return 0;
}
/*
	arr[]:一个足够大的数组用来存放生存的数
	n:是递归变化的参数
	length:数组的长度 
*/
void dfs( int* arr, int n,int length)
{
	int i;
 	 if(n==length) //递归出口 
 	 {
 	 	for(i=0;i

解决了字典排序,只需对字典排序递推的过程再次判断,即检查是否可以放置。和八皇后问题相同,判断这一数值能否放置,可以则递推,否则继续下一个判断。如下图(部分):
回溯法之素数环问题_第2张图片
代码如下:
#include 
#define maxsize 16
int is_prime(int n); 
void dfs( int arr[], int n,int length); 
int mark[maxsize+1]={0};//定义及初始化标记数组 
int main()
{
	int arr[maxsize]={0};	//定义一个数组 
	arr[0]=1;		//首先将第一个数组值定为1 ,题目要求 
	mark[0]=1;		//既然定下值那么标记数组同样跟上	
	dfs(arr,1,13);   
	return 0;
}
int is_prime(int n)//判断传入的数是否为素数 
{
	int i=0;
	for(i=2;i
发现此代码并没有在字典排序的代码上有多少改动,只是对递推条件的判断更具体。终于结束了,欢迎大家支出文章不足之出,能力有限,只能于此,写博客也是为自己立个flag。

你可能感兴趣的:(C语言知识,算法学习)