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;
    }
  • 相关阅读:
    C++中图片重命名
    linux 常用shell命令之wc
    Linux shell命令之cat
    linux 常用shell命令 ls
    开启博客之旅
    C#并行编程之Parallel的使用
    centos7下安装iperf时出现 make: *** No targets specified and no makefile found. Stop.的解决方案
    勒索病毒场景模拟及原理
    测试用例覆盖分类
    Centos 7下Hadoop分布式集群搭建
  • 原文地址:https://www.cnblogs.com/flying-rabbit/p/10721058.html
Copyright © 2011-2022 走看看