新手,求教java素数环用回溯怎么实现 这个应该很easy吧?直接无脑search就行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此类问题,无非是排列、组合及其变种,建议先搞懂幂集、全排列、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 关于socket javaSE怎么实现联机应用,做四人打牌游戏用的? 关于 java "装箱"与"拆箱" 的原理 new Runnable() 问题? 第一次来,希望大家多多指教! 帮朋友问的.看来是帮不上忙了..大家帮忙看看.(大家可以熟练下多线程和数组...) 怎么在linux下运行java 这个题目好象编译有错啊>??再线等 很菜的问题......关于APPLET Applet中改变字体和大小显示?在线等待,急!!! 多线程 wait用法 BlockingQueue问题,模拟生产者消费者,为何queue为空也可以consume呢
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