A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Note: the number of first circle should always be 1.
You are to write a program that completes above process.
Print a blank line after each case.
6 8
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
分析:使用深搜来实现此题,深搜的是实际过程就是遍历每一种可能性知道满足边界值然后输出结果,
这个题就是你并不知道哪种序列是最终结果,就是把欢上面的每个节点填满即可,当然要进行不断地回溯寻找答案。注意标志数组的清除即可
import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static int n; static int[] a = new int[25]; static int[] vis = new int[25]; //判断素数,此题数据比较少,也可以采用预先打表的方式来做 static int[] primelist = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0 ,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1}; //注意最大和的值为38 static boolean isPrime(int x) { if(x<2) return false; for (int i = 2; i <= Math.sqrt(x); i++) { if(x%i==0) return false; } return true; } static void dfs(int de) { //不要忘了这是一个环,所以第一个和最后一个也要判断 if(de==n&&isPrime(a[1]+a[n])) { for (int i = 1; i <= n-1; i++) { System.out.print(a[i]+" "); } System.out.println(a[n]); return; } //尝试每个 for (int i = 2; i <= n; i++) { if(vis[i]==0&&isPrime(a[de]+i)) { vis[i]=1; a[de+1]=i;//填充这个节点,当前层 dfs(de+1);//填充下一个节点 vis[i]=0; } } } public static void main(String[] args) { int cas=0; while(in.hasNext()) { Arrays.fill(vis, 0); a[1]=1;vis[1]=1; cas++; n = in.nextInt(); System.out.println("Case "+cas+":"); dfs(1); System.out.println(); } } }