题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
package D0808;
/*
* 题目大意:给定一个整数n。要你求一个环(可能不止一个),这个环中的的最大的数为n
* 并且环中任意两个相邻的数的和为素数。
* */
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.*;
public class HDU1016 {
static int[]arr;//保存找到的每组符合条件的数据,找到一组就输出一组
static boolean[] used;//保存这数字是否已经使用过
static int n;
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = 1;
while (sc.hasNext()) {
n = sc.nextInt();
arr = new int[n+1];
used = new boolean[n+1];
out.println("Case "+cases+":");
cases++;
dfs(1,1);
out.println();
}
out.flush();
}
/*
*@no:当前存入数组的序号
*@number:当前存入数组中的数。
* */
public static void dfs(int no,int number){
arr[no] = number;
used[number] = true;
int i;
if(no == n){//如果存入的是最后一个数,则判断最后一个数和1相加是否为素数
if(is_prime(arr[1]+arr[no])){
out.print(arr[1]);
for(i = 2;i<=n;i++)
out.print(" "+arr[i]);
out.println();
}
return;
}
//由于1已经放进数组中了,这里从2开始循环到n放到数组中去
for(i = 1; i<=n;i++){
if (!used[i] && is_prime(arr[no] + i)) {
dfs(no + 1, i);
used[i] = false;//如果没有成功,恢复标签(回溯)
}
}
return;
}
//判断x是否是素数
public static boolean is_prime(int x){
for(int i = 2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
}