/*
算法思想:首先,总的是利用递归法,然后再使用交换的方法来获取扩展,确定每一个位置的值,
若在递归过程中发现有不合适的值,回溯并再次使用交换恢复原来的序列,对原位置重新寻找下一个合适的值;
分析:假设共有n个数,则每个位置可以填写的情况有n种,因此,素数环的解空间是一棵完全n叉树。又因为
寻找一个满足素数环的序列相当于寻找一个数字1到n全排列中的一种,所以其时间复杂度相当于全排列对应的时间复杂度,
即O(n!),则最坏的情况为(n^n).
*/
#include<iostream>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
#define N 20
using namespace std;
int g[N+1]={
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
void SetPlace(int place);
int Isprime(int x);
void Output();
void Swap(int place,int i);
int main()
{
//从位置1开始递归回溯,为每个位置设置一个可靠的值
SetPlace(1);
return 0;
}
//对第K个位置置值(使用交换的方法获取扩展)
void SetPlace(int place)
{
//递归结束条件
// 如果搜索到终点,则打印路径,结束本条路径的搜索。
if(place > N){
//如果首位可以连成环
if(Isprime(g[1] + g[N]))
Output();
}
else{
for(int i = place; i <= N; i++){
Swap(place,i);
//若该位置与前一个数的和为素数,则进入下一个元素的判断
if(Isprime