Java实现素数环问题

问题描述

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

样例输入

6

样例输出

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

思路

  • 此题和八皇后问题类似,采用深度优先搜索的思想
  • 用一维数组存储结果,首元素定为1
  • 定义整数k,表示搜索的层数(第k个数应填入哪个数),递归地搜索下一层,直到k=n则表示一种排列方法

代码

import java.util.Scanner;

public class PrimeCircle {
     
	public static void main(String[] args) {
     
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		input.close();
		int[] array = new int[n];
		array[0] = 1;
		dfs(array,1);
	}
	private static void dfs(int[] array ,int k) {
     
		if(k == array.length && isPrime(array[0] + array[array.length - 1])) {
     //首尾的两个数之和也应为素数
			print(array);
		}
		for (int i = 2; i <= array.length; i++) {
     
			if(check(i,array,k)) {
     
				array[k] = i;
				dfs(array, k + 1);
			}
		}
		
	}
	private static void print(int[] array) {
     
		for (int i = 0; i < array.length; i++) {
     
			System.out.print(array[i] + " ");
		}
		System.out.println();
		
	}
	private static boolean check(int i, int[] array, int k) {
     
		int flag = 0;
		for (int j = 0; j < k; j++) {
     
			if(array[j] == i) {
     
				flag = 1;
				break;
			}
		}
		if(flag == 0 && isPrime(i + array[k - 1]))
			return true;
		return false;
	}
	
	private static boolean isPrime(int i) {
     
		for (int j = 2; j *j <= i; j++) {
     
			if(i % j == 0)
				return false;
		}
		return true;
	}
}

你可能感兴趣的:(dfs,算法)