素数环 dfs

题目描述

输入正整数n,对1-n进行排列,使得相邻两个数之和均为素数,
输出时从整数1开始,逆时针排序。同一个环输出一次
如输入6
输出

  • 1 4 3 2 5 6
  • 1 6 5 2 3 4

题目理解

素数环满足条件

  • 相邻两个数之和为素数(包括首尾之和)
  • 素数环有1-n组成 不能有重复的数字

代码

public class 素数环 {
	static int n;
	
public static void main(String[] args) {
	Scanner sc =new Scanner(System.in);
	n=sc.nextInt();
	int[]d;
	d = new int[n+1];
	d[1]=1;
	dfs(2,d);
	
}
public static void dfs(int m,int[]d) {
	if(m==(n+1)&&issu(d[n]+d[1])) {
		for (int i = 1; i <= n; i++) {
			System.out.print(d[i]);
		}
		System.out.println();
		return;}
	for(int i=2;i<=n;i++ ) {
		if(check(d,m,i)) 
		{
		d[m]=i;
		dfs(m+1,d);
		d[m]=0;//回溯
		}
	}
}
public static boolean check(int[]d,int m,int i) {
	for(int a =1;a<=n;a++) {
		if(d[a]==i||!issu(d[m-1]+i))return false;
	}
	return true;
}
public static boolean issu(int k) {
	for(int i=2;i*i<=k;i++) {
		if(k%i==0)return false;
	}
	return true;
}
}

写了两个小函数 issu用于判断这个数是否为素数
check用于检查加入的数和数组中是否有重复数字,并调用issu

这里用的典型思想就是dfs
大体轮廓为
在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页