最近在做算法时碰到这样一道题目,题目是这样的:
把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
这是一个典型的回溯算法的解决案例,相当于是把n个数全排列的算法的衍生。代码如下:
#include <stdio.h>
#include <stdlib.h>
#define add(a,b) a+b
int b[20];
void init();
int isPrime(int);
void swap(int,int);
void printResult();
void search(int);
int main()
{
init();
search(2);
return 0;
}
int isPrime(int num){
int a[]={3,5,7,11,13,17,19,23,29,31,37};
int i;
for(i=0;i<11;i++){
if(num==a[i])
return (1);
}
return (0);
}
void swap(int m,int i){
int temp;
temp=b[m];
b[m]=b[i];
b[i]=temp;
}
void init(){
int i;
for(i=0;i<20;i++){
b[i]=i+1;
}
}
void printResult(){
int i;
for(i=0;i<20;i++){
printf("%d ",b[i]);
}
printf("\n");
}
void search(int m){
if(m>19){
if(isPrime(b[19]+b[0])){
printResult();
}
return;
}else{
int i;
for(i=m;i<20;i++){
swap(m,i);
if(isPrime(b[m-1]+b[m])){
search(m+1);
}
swap(m,i);
}
}
}
把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
这是一道典型的用回溯算法解决的题目。是