杭电1016 素数环 java代码实现

来源:互联网 发布:linux下的tmp目录 编辑:程序博客网 时间:2024/05/19 20:47

题目链接点击打开链接


这是我自己所学会使用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;//令素数环第一个数为1vis[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;}}


2 0