蓝桥杯 小朋友崇拜圈 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;
	}

}

posted @ 2023-03-28 19:10  limyu  阅读(10)  评论(0)    收藏  举报  来源