蓝桥杯(java)| 小朋友崇拜圈

题目描述

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)
在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?
小朋友编号为1,2,3,··
输入描述
输入第一行,一个整数N(3<N<105)。
接下来一行N个整数,由空格分开
输出描述
要求输出一个整数,表示满足条件的最大圈的人数。

输入案例

9
3 4 2 5 3 8 4 6 9

输出案例

4
package 蓝桥;

import java.util.Arrays;
import java.util.Scanner;

public class AdmireCircle {
	static int maxlen=0;//最大长度
	static int tmpmaxlen=0;//临时最大长度
	static Scanner in=new Scanner(System.in);
	static int N=in.nextInt();
	static int[] admire=new int[N+1];
	static boolean[] tag=new boolean[N+1];//题目所给案例有下标N
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		
		for(int i=1;i<N+1;i++) {
			admire[i]=in.nextInt();
		}
		//循环,看第i个下标是否能构成题目所要求的圆
		for(int i=1;i<N+1;i++) {
			//第一个参数是崇拜对象位置数组,第二个参数是小朋友所在下标,第三个参数
			//是小朋友崇拜对象所在下标,因为崇拜对象可以是自己,或是在右手边,所以下标从小朋友自己开始
			def(admire,i,i);
			Arrays.fill(tag, false);//使标签数组重置
		}
		System.out.println(maxlen);
	}
	private static void def(int[] admire2, int i, int target) {
		tmpmaxlen++;//要包括小朋友自己,先加1
		if(admire2[i]==target) {
			maxlen=Math.max(tmpmaxlen, maxlen);
			tmpmaxlen=0;//一定要重置tmpmaxlen的大小
			return;
		}
		if(admire[i]!=target && tag[i]==false) {
			tag[i]=true;
			def(admire,admire[i],target);//admire[i]表示第i个小朋友崇拜的小朋友
		}else {
			tmpmaxlen=0;//如果遍历完还没找到,结束递归,重置tmpmaxlen
			return;
		}
		
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值