一.题目
二.代码实现
public class Main {public static int max = 0;//结果public static int x;//数组大小public static boolean[] b;//判断数组public static int[] array;//数组记录public static int start;public static void main(String[] args) {Scanner scan = new Scanner(System.in);x = scan.nextInt();b = new boolean[x+1];array = new int[x+1];for(int i = 1;i<=x;i++) array[i] = scan.nextInt();for(int i = 1;i<=x;i++){start = i;dfs(i,0);}System.out.println(max);scan.close();}public static void dfs(int n,int size)//终止位置,尺寸{if(b[n]){if(start == n && max<size)//起始与终止指向一个人{max = size;}return;}if(b[n]==false)//说明这个结点没有被访问过{b[n] = true;dfs(array[n],size+1);b[n] = false;//进行回溯}}
}
三.解析
首先分析问题,这道题为什么要用dfs算法?
我们很容易想到对每一种可能进行枚举来解决这道题,那么dfs算法不就是通过回溯枚举出每一种可能的算法吗
dfs算法怎么使用?
1.首先创建一个boolean数组,用于判断是否访问过对应结点
2.确定方法的参数
2.设置得到答案的语句,这一步我觉得也是最困难的一步
3.判断递归位置来进行回溯,注意回溯一定是在递归语句的上面
回到这道题本身,要求我们找出能围城全的最大个数
不要被“要崇拜的对象一定要坐在我们的右手边迷惑了”,什么时候能围城一个圈呢,只有当最后一个人与我们起始的那个人是一个人时才能围成一个圈,所以我们的输出判断语句条件也就是这个,并且只有当当前围成圈的个数大于我们记录的最大个数时才继续赋值