zoukankan      html  css  js  c++  java
  • 菜鸡学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 0;
        return 1 + fun(pass[x]);
    }
    int main()
    {
        int ans = 0;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", &pass[i]);
        for(int i = 1; i < n; i++)
            ans = max(ans, fun(i));
        printf("%d", ans);
        return 0;
    }
  • 相关阅读:
    docker学习
    redis哨兵部署
    HUE中一些重要元数据表的DDL整理
    Autosys中ON_HOLD和ON_ICE的区别
    Spark结构化API的执行过程——Logical Plan & Physical Plan
    关于Spark中Columns的引用方法
    关于Spark Dataset API中的Typed transformations和Untyped transformations
    关于Kafka Consumer 与 Partitions
    使用sed根据变量值注释掉文件中相匹配的记录行
    sqoop export to teradata时出现java.lang.NullPointerException
  • 原文地址:https://www.cnblogs.com/flying-rabbit/p/10721058.html
Copyright © 2011-2022 走看看