蓝桥杯 小朋友崇拜圈 DFS Java
遍历所有小朋友,都将其设为起点一遍。找环记录步数,Max记录最长步数。如果next指向的是起点那么就说明是一个环。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int n,now,next,max,len;//个数,当前起点,当前下一个点,最长步数,记录长度
static int flag[];//记录是否被遍历过一遍
static int p[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
p = new int[n+1];
flag = new int[n+1];
for(int i = 1;i<=n;i++){
p[i] = sc.nextInt();
}
for(int i =1;i<=n;i++){
now = i;//当前起点是i
len = 0;//步数为0
dfs(p[i]);//传入当前起点的下一个指向
}
System.out.println(max +1);//因为是先判断后len++,所以少加一个1
}
private static void dfs(int num) {
len ++;//没找一次步数加一
next = p[num];//下一个的指向
if(now == next){//如果下一个指向与初始值相等,说明是个圈
max = Math.max(max,len);//记录最大步数
return;
}
//当前的下一个指向
if(pd(next)){//判断下一个是否下标越界,是否已经被遍历过
flag[next] = 1;
dfs(next);
}else{
len = 0;
Arrays.fill(flag,0);//恢复
return;
}
}
private static boolean pd(int i) {
if(i<0 || i>=n){
return false;
}
if(flag[i] == 1){//已经被遍历过且不满足check说明陷入了死循环,返回false
return false;
}
return true;
}
}

浙公网安备 33010602011771号