题目描述
班里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;
}
}
}