题意:给一个1~20之间的数n,找到一条俩俩数字相邻 相加结果是素数的圈,如n=6时:这6个数可找到一条1+4=5,4+3=7,3+2=5,2+5=7,5+6=11,6+1=7的圈
本题不难,要了解DFS(深搜)的原理,从1开始遍历下去,便会反馈结果。
博主有一篇关于 深搜原理 的博客,不明白的可以去看看,明白深搜即看下面代码(java):
import java.util.Scanner;
class Main{
//深度优先遍历,假定一个数组a[n][n]是关于n个变量之间的网状关系
//对i-j之间有关用a[i][j]=1,无关用a[i][j]=0表示
//state表示search开始点
public static void searchDFS(int[][] a,int state){
//color表示节点访问情况
int[] color=new int[a.length];
for (int i = 1; i < color.length; i++) {
color[i]=-1;//未访问
}
//parent表示各个节点的父节点
int[] parent=new int[a.length];
for (int i = 1; i < parent.length; i++) {
parent[i]=-1;//表示null,没有
}
//条件
int count=0;
//开始遍历
dfsVisit(a,color,parent,state,count);
}
private static void dfsVisit(int[][] a, int[] color, int[] parent,
int state, int count) {
//此节点遍历到
color[state]=1;
count++;
//条件满足实现
state = accomplish(a, parent, state, count);
for (int last = 1; last < a[state].length; last++) {//遍历所有其他节点
if(a[state][last]==1&&color[last]==-1){//满足条件,搜下去
parent[last]=state;//使子节点记住访问而来的父节点
dfsVisit(a, color, parent, last, count);//递归深搜
parent[last]=-1;//该条路径搜完,改变回来,以便另一条遍历
color[last]=-1;
}
}
}
//条件满足输出
private static int accomplish(int[][] a, int[] parent, int state, int count) {
if(count==a.length-1&&isPrime(state)){
int[] num=new int[a.length-1];
int i=0;
num[i++]=state;
while(true){
if(parent[state]!=-1){
state=parent[state];
num[i++]=state;
}else
break;
}
for (int j = num.length-1; j > 0; j--) {
System.out.print(num[j]+" ");
}
System.out.println(num[0]);
}
return state;
}
private static boolean isPrime(int state) {//是否是素数
return isPrime(1,state);
}
private static boolean isPrime(int i, int j) {
int sum=i+j;
if(sum==2)
return true;
for (int k = 2; k*k<=sum; k++) {
if(sum%k==0)
return false;
}
return true;
}
static int ca=1;//主函数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[][] a=new int[n+1][n+1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(isPrime(i,j))
a[i][j]=1;
else
a[i][j]=0;
}
}
System.out.println("Case "+ca+":");
searchDFS(a, 1);
System.out.println();
ca++;
}
}
}