原文地址:http://www.cnblogs.com/xwz0528/p/4638242.html
一. 问题描述
把从1到n(n>=2)这n个数摆成一个环,要求相邻的两个数的和是一个素数,找出所有满足条件的环。
二. 问题分析
1> 解向量:<x1, x2, ··· , xn>
2> 解空间树:排列树,(n-1)!个叶子结点
3> 剪枝函数:isPrime( x[t-1]+x[t] ),t=2,3,···,n 约束函数
三. 算法实现
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 5 int n;//素数环中的数字个数 6 int sum=0;//可行方案数 7 int arr[100];//存放素数环 8 9 bool isPrime(int x) 10 { 11 int i; 12 int k=(int)sqrt(x); 13 for(i=2;i<=k;i++) 14 { 15 if(x%i==0) 16 { 17 return false; 18 } 19 } 20 return true; 21 } 22 23 //回溯法 24 void backtrack(int t) 25 { 26 int i; 27 if(t>n)//搜索到叶子结点 28 { 29 if(isPrime(arr[n]+arr[1])) 30 { 31 sum++; 32 for(i=1;i<=n;i++) 33 { 34 cout<<arr[i]<<" "; 35 } 36 cout<<endl; 37 } 38 } 39 else 40 { 41 for(i=t;i<=n;i++) 42 { 43 swap(arr[t],arr[i]); 44 if(isPrime(arr[t-1]+arr[t])) 45 { 46 backtrack(t+1); 47 } 48 swap(arr[t],arr[i]); 49 } 50 } 51 } 52 53 void main() 54 { 55 int i; 56 cout<<"请输入素数环中数字的个数:"; 57 while(cin>>n) 58 { 59 sum=0; 60 for(i=1;i<=n;i++) 61 { 62 arr[i]=i; 63 } 64 backtrack(1); 65 cout<<"可行方案数为:"<<sum<<endl; 66 cout<<"----------------"<<endl; 67 cout<<"请输入素数环中数字的个数:"; 68 } 69 }