(网易2018校招笔试)(JAVA实现游历魔法王国

本文介绍了一个基于递归算法计算旅行者在有限步数内能够游历的最大城市数量的问题。通过输入城市数量、允许的步数及城市间的连接方式,算法能够帮助规划最优旅行路线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

魔法王国一共有n个城市,编号为0~n-1,n个城市之间的道路连接起来恰好构成一棵树。
小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。

如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算) 

输入描述:

输入包括两行,第一行:(两个正整数n表示城市个数(2 ≤ n ≤ 50)L易能行动的次数(1 ≤ L ≤ 100)

第二行:(n-1个整数)(i表示输入n-1个整数的顺序)parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),(i+1)号城市和parent[i]间有一条道路连接。

输出描述:

输出一个整数,表示小易最多能游历的城市数量。


构成的树:

分三种情况讨论:

1.  步长 小于 树的最大深度,输出 步长+10城市本身已经游历过)

2.  步长 大于 树的最大深度且不能走完全部的城市

条件是:步长>树的最大深度 && (步长-树的最大深度)/2 + 树的最大深度 + 1 < 城市数量n

3.  步长 大于 树的最大深度且能走完全部的城市


JAVA实现代码:

import java.util.Scanner;
public class JourneyOfKingdom {
    private static int[] parent = new int[100];
    public static void main(String[] args){
        //输入数据
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int l = scanner.nextInt();
        scanner.nextLine();
        for(int i=1;i <= n-1;i++){
            parent[i]=scanner.nextInt();
        }

        //递归出每个节点的深度
        int[] nodeDepth = new int[n];
        for(int i=1;i <= n-1;i++){
            regression(i);
            nodeDepth[i] = regression(i);
        }

        //遍历全部节点,找出最大深度
        int maxDepth=0;
        for(int i=1;i <= n-1;i++){
            if(nodeDepth[i] >= maxDepth){
                maxDepth = nodeDepth[i];
            }
        }

        //判断情况
        if(l <= maxDepth){
            System.out.println(l+1);
        }else if(l > maxDepth && (l-maxDepth)/2 + maxDepth +1 < n){
            System.out.println( (l-maxDepth)/2+maxDepth+1 );
        }else{
            System.out.println( n );
        }

        System.exit(0);
    }

    private static int regression(int i){
        if(i == 0){
            return 0;
        }
        return regression(parent[i])+1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值