问题:给定1,2,……n的自然数,将它们连接成环,求满足任意两个邻接自然数之和为素数的环。
分析:属于搜索题,运用回溯法进行求解。
:java代码
import java.util.Arrays;
import java.util.Scanner;
public class problem1016 {
static int []use_tag;
static int []ring;
static int N;
static int num;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
num=1;
while(scan.hasNext()){
N=scan.nextInt();
use_tag=new int[N+1];
ring=new int[N+1];
Arrays.fill(use_tag, 0);
Arrays.fill(ring, 0);
use_tag[1]=1;
ring[1]=1;
System.out.println("case "+(num++)+":");
DFS_RingSearch(1);
System.out.println();
}
}
static void DFS_RingSearch(int position){
if(position>=N&&isPrime(ring[N]+1)){
for(int i=1;i<=N;i++){
if(i!=N)
System.out.print(ring[i]+" ");
else
System.out.println(ring[i]);
}
}
else{
for(int i=2;i<=N;i++){
if(use_tag[i]==0&&isPrime(i+ring[position])){
ring[position+1]=i;
use_tag[i]=1;
//开始用了position++,结果数组越界了
DFS_RingSearch(position+1);
use_tag[i]=0;
}
}
}
}
static boolean isPrime(int m){
for(int i=2;i<=m/2;i++){
if(m%i==0)
return false;
}
return true;
}
}
回溯法:回溯法就是在解空间树中,按照深度优先搜索的策略进行搜索,根据判断条件进行剪枝,当底层搜索结束后就向上回溯。