当前位置: 代码迷 >> J2SE >> 新手,求教java素数环用回溯如何实现
  详细解决方案

新手,求教java素数环用回溯如何实现

热度:65   发布时间:2016-04-23 20:02:13.0
新手,求教java素数环用回溯怎么实现
新手,求教java素数环用回溯怎么实现,谢谢
------解决思路----------------------
此类问题,无非是排列、组合及其变种,建议先搞懂幂集、全排列、C(M,N)、A(M,N)四个程序。


public class PrimeCircle {
/**
 *判断素数
 */
public static boolean isPrime(int n){
if(n==1){
return false;
}else if(n==2){
return true;
}else{
int half=(int) Math.sqrt(n);
for(int i=2;i<=half;i++){
if(n%i==0){
return false;
}
}
return true;
}
}
/**
 *交换
 */
public static void swap(int[] array,int a,int b){
int t=array[a];
array[a]=array[b];
array[b]=t;
}
/**
 * 深度优先搜索
 */
public static boolean dfs(int[] array,int level){
if(level==array.length){
//到达叶子节点
//判断首尾元素的和是否为素数,如果是,则输出结果
if(isPrime(array[0]+array[level-1])){
for(int k:array){
System.out.print(k+" ");
}
System.out.println();
return true;
}else{
return false;
}

}else{
//假设没有
boolean flag=false;
for(int i=level;i<array.length;i++){
swap(array, level, i);
if(level==0){
if(dfs(array, level+1)){
flag=true;
swap(array, level, i);
break;
}
}else if(isPrime(array[level]+array[level-1])){
//递归下一层,只要找到一组解,则停止递归
if(dfs(array, level+1)){
flag=true;
swap(array, level, i);
break;
}
}
swap(array, level, i);
}
return flag;
}
}
public static void primeCircle(int n){
int[] array=new int[n];
for(int i=1;i<=n;i++){
array[i-1]=i;
}
dfs(array, 0);
}
public static void main(String[] args) {
primeCircle(20);
}
}


结果:
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 18 19 12 
  相关解决方案