主环问题:
问题描述
如图所示,环由n个圆组成。将自然数1,2,…,n分别放入每个圆圈中,并且相邻两个圆圈中的数字总和应为素数。
注意:第一个圆圈的数量应该始终为1。
输入
n(0《n<20)。
输出
输出格式如下所示。每行代表从1开始顺时针和逆时针旋转的一系列圆圈数字。数字的顺序必须符合上述要求。按照字典顺序打印解决方案。
你要编写一个完成上述过程的程序。
在每个案例后打印一个空行。
Sample Input
6
8
Sample Output
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
思路:核心思路是使用dfs暴力破解,遍历所有能形成的可能性,然后输出满足条件的,优化的话可以考虑剪枝,还要用一些参数表示元素的个数和之前存储的元素,考虑的条件是元素和前一个元素的和是否为素数,如果到了最后一个数还要考虑第一个数。
代码如下:
import java.util.Scanner; public class 杭电1016 { static boolean b[]=new boolean[21];//用于判断是否用过 static int time=0;//层数 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int Case=1;//输入案例第几个 while(sc.hasNext()) { int m=sc.nextInt();//个数 int a[]=new int[m];//存储元素 a[0]=1; System.out.println("Case " Case ":"); dfs(m,a); System.out.println(); //judgel(m);//判断素数 } } private static boolean judgel(int m) {//如果为素数返回真 for(int i=2;i<m;i ) { if(m%i==0) {return false;} } return true; } private static void dfs(int m, int[] a) { if(time==m-1) {for(int i=0;i<m;i ) //知道长度满足,一定满足情况 {if(i==m-1)System.out.print(a[i]);else System.out.print(a[i] " ");}System.out.println();} else for(int i=2;i<m 1;i ) { if(!b[i]) { if(time==m-2) { b[i]=true; if(judgel(i a[time])&&judgel(i 1)) { a[ time]=i; dfs(m,a); time--; } b[i]=false; } else { b[i]=true; if(judgel(i a[time])) { a[ time]=i; dfs(m,a); time--; } b[i]=false; } } } } }