HDU1016深搜实例

这个题目我们通过分析,可以这样认为,每个数字都可以是另外数字的领节点。那么当然一个数字就要和其他5个数字进行判断,当我们将两个数字判断为素数的时候,这时候我们记录第二个它的父节点为第一个数字,再往下与其他4个数字进行判断。如果不符合条件,我们就返回上一个节点,并且还原。最后如果父节点数组的里面的节点个数为n,并且首尾两个也满足素数条件 我们就认为此次遍历成功。并输出。以下是已AC代码

<span style="font-size:18px;">import java.util.Scanner;

public class Main {
    static int k=0;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int[] a=new int[n];//存储字节数值
            int[] color=new int[n];//存放搜索标志 -1表示未被搜索
            int[] parent=new int[n];//存放父节点 -1表示null
            int count=0;//用来记录个数
            System.out.println("Case "+(++k)+":");
            //搜索前的初始化
            for (int i = 0; i <n; i++) {
                a[i]=i+1;
                color[i]=-1;//把为搜索的标记为-1;
            }
            
            dfs(a,color,parent,0,count);
            System.out.println();
        }
    }

    private static void dfs(int[] a, int[] color, int[] parent, int startNode,int count) {
        count++;
        if (count==a.length && isPrime(a[startNode]+a[0])) {
            parent[count-1]=a[startNode];
            print(parent);
        }
        for (int v = 0; v < a.length; v++) {
            color[startNode]=1;
            if (color[v]==-1 && isPrime(a[startNode]+a[v])) {
                parent[count-1]=a[startNode];
                dfs(a, color, parent, v, count);
                //回退的话,我们要保留现场,将之前的还原。
                color[v]=-1;//还原标记
            }
        }
    }

    private static void print( int[] parent) {
        for (int i = 0; i < parent.length; i++) {
            if (i<parent.length-1) {
                System.out.print(parent[i]+" ");
            }else {
                System.out.println(parent[i]);
            }
        }
        
    }

    private static boolean isPrime(int n) {//判断是否为素数代码
        if(n==2){
            return true;
        }
        for(int i=2;i*i<=n;i++){
            if(n%i==0){
                return false;
            }
        }
        
        return true;
    }

}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值