题目链接:https://www.dotcpp.com/oj/problem1544.html

    题目分析:根据题目给定的条件可知,需要在数组{1, 2, 3, 5, 7, 9}中枚举,且组合成的数字的长度为N,每个数字可以多次使用,但是需要保证符合条件的要求(例如数字2393,需要符合2393,239,23,2均为质数)。

    dfs的设计思路:每个数字有多次使用,因此不需要设置 visited数组,直接在dfs开一个for循环,然后进行递归,这样可以做到枚举所有的情况,递归出口为选取的数字个数 > N。

    递归树如下:
    image.png

    1. import java.util.*;
    2. public class Main{
    3. public static boolean judge(long number){
    4. if(number == 1){
    5. return false;
    6. }
    7. for(int i = 2; i <= Math.sqrt(number); i++){
    8. if(number % i == 0){
    9. return false;
    10. }
    11. }
    12. return true;
    13. }
    14. public static void dfs(int[] nums, int n, int count, long number){
    15. if (!judge(number)){ //此处为剪枝操作
    16. return;
    17. }
    18. if(count == n){
    19. if(judge(number)){
    20. System.out.println(number);
    21. }
    22. return;
    23. }
    24. for(int i = 0; i < nums.length; i++){
    25. dfs(nums, n, count + 1, number * 10 + nums[i]);
    26. }
    27. }
    28. public static void main(String[] args) {
    29. Scanner sc = new Scanner(System.in);
    30. int n = sc.nextInt();
    31. int[] nums = {1, 2, 3, 5, 7, 9};
    32. dfs(nums, n, 0, 0);
    33. }
    34. }