题目链接点击打开链接
这是我自己所学会使用DFS所做的第一个题目,如有不好的地方或者错误,希望大神多多指教。
题目大意为:输出指定个数的素数环,素数环为一个环中相邻的2个数之和都为素数。
基本解题思路:使用DFS算法
代码实现如下:
import java.util.*;
class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int t=1;
while(sc.hasNext()){
int n=sc.nextInt();
boolean vis[]=new boolean[n+1]; //标记数组,用于标记该数是否被用过
int a[]=new int[n]; //装素数环的数组
for(int i=1;i<=n;i++){
vis[i]=true; //初始化标记数组,true为该书未被使用过
}
System.out.println("Case "+(t++)+":"); //输出格式Case t:
a[0]=1; //令素数环第一个数为1
vis[1]=false; //标记数字1已经被用过
dfs(vis,a,1,n); //开始搜索
System.out.println();
}
}
public static void dfs(boolean vis[],int a[],int i,int n){
if(sushu(a[0]+a[n-1])&&i==n){ //递归跳出条件,当素数环数组中第一个数与最后 一个数相加为素数时,并输出素数环
for(int j=0;j<n;j++){
if(j==n-1){
System.out.println(a[j]);
}else{
System.out.print(a[j]+" ");
}
}
//return;
}
for(int j=1;j<=n;j++){ //遍历每个数
if(vis[j]&&sushu(a[i-1]+j)){ //如果该数没被用过并且与素数环中的 上一个数相加为素数则把它加入到素数环中
a[i]=j;
vis[j]=false; //标记此数已经被用过
dfs(vis,a,i+1,n); //搜索下一个数
vis[j]=true;
}
}
}
public static boolean sushu(int i){ //素数判断方法
for(int j=2;j*j<=i;j++){
if(i%j==0){
return false;
}
}
return true;
}
}