菜鸡学C语言之真心话大冒险

题目描述

Leslie非常喜欢真心话大冒险的游戏。这一次游戏的规则有些不同。每个人都有自己的真心话,一开始每个人也都只知道自己的真心话。每一轮每个人都告诉指定的一个人他所知道的所有真心话,那么Leslie想知道,多少轮后他能知道所有人的真心话呢?题目保证数据有解。

输入

第一行一个数n,表示一共有n个人,编号为1~n, Leslie为第n个人。n<=1000

第二行有n个数,第i个数表示第i个人要传递真心话的对象。

输出

输出一个数x,表示第x轮后Leslie知道了所有的真心话。

输入样例

4
2 4 2 1

输出样例

2

题目链接:https://buaacoding.cn/problem/1971/index

写在前面:

相信有C语言基础的同学都不难理解递归。举个简单的例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山...

递归是我们经常用到的算法,当熟悉递归的做法以及题目的思路时,递归经常可以简化代码量。当然,递归也有他的弊端,那就是递归是一个不断深入的过程,在这过程中它每次都需要开辟一块栈空间来存储,使得递归的运行效率通常较低。当然,理论上,每个递归算法都可以转化为非递归(循环)来实现。

题目分析:在每一轮当中,每个人告诉他要告诉的人他知道的真心话(好拗口)。

注意:在这一轮结束后,大家同时知道新的真心话。因为我在看有的代码时发现有同学用循环实现时通常会为大家知道真心话添加顺序,即在同一轮中,如果一个人知道新的真心话后,他接下来也会把这个真心话告诉他要告诉的人,但这其实是不对的。

思路:所有人中需要传递次数的最大值就是答案!

递归,看程序即可。

#include<stdio.h>
#define MAX 1005
#define max(a,b) (a>b?a:b)
int n, pass[MAX]; // pass数组用来存储他要告诉真心话的人
int fun(int x)
{
if(x == n)
return ;
return + fun(pass[x]);
}
int main()
{
int ans = ;
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", &pass[i]);
for(int i = ; i < n; i++)
ans = max(ans, fun(i));
printf("%d", ans);
return ;
}
上一篇:【机器学习】EM算法详细推导和讲解


下一篇:Python 学习之urllib模块---用于发送网络请求,获取数据(5)