首页 > 其他分享 >数组的往返(数组来回遍历)C语言版

数组的往返(数组来回遍历)C语言版

时间:2024-10-21 13:50:50浏览次数:3  
标签:修剪 遍历 Shrub int 灌木 C语言 数组 outcome

文章目录


前言

本篇文章灵感来源于 第十三届蓝桥杯省赛C++B组第六题修剪灌木,我的方法是老老实实地走完这个流程得到答案


题目描述

爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复
灌木每天从早上到傍晩会长高 1 厘米,而其余时间不会长高。在第一天的 早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高

输入格式
一个正整数 N, 含义如题面所述

输出格式
输出 N 行,每行一个整数,第 i 行表示从左到右第 i 棵树最高能长到多高

样例输入

3

样例输出

4
2
4

一、数组的往返是什么?

我们把灌木看成数组的元素,爱丽丝修剪的过程就是数组的来回遍历
我称之为数组的往返

二、实现

1.具体代码

以下是题解中修剪灌木的函数 Shrub_cut 也是来回遍历数组的实现,来回遍历次数可以通过改变i控制,其中N为灌木数量,文章最后我会给出

void Shrub_cut(int* Shrub, int i, int N)
{
    // 计算当前方向
    int direction = (i / N) % 2; // 0为向右,1为向左
    int index;

    // 根据当前方向决定修剪的灌木索引
    if (direction == 0) // 向右修剪
    {
        index = i % N; // 从0到N-1循环
    }
    else // 向左修剪
    {
        index = N - 1 - (i % N); // 从N-1到0循环
    }

    // 修剪当前索引的灌木
    Shrub[index] = 0; // 将灌木高度设为0
}

2.完整题解代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void Shrub_grow(int* Shrub, int N)//灌木生长
{
    for (int i = 0; i < N; i++)
    {
        Shrub[i] += 1;
    }
}

void Shrub_cut(int* Shrub, int i, int N)//灌木修剪
{
    // 计算当前方向
    int direction = (i / N) % 2; // 0为向右,1为向左
    int index;

    // 根据当前方向决定修剪的灌木索引
    if (direction == 0) // 向右修剪
    {
        index = i % N; // 从0到N-1循环
    }
    else // 向左修剪
    {
        index = N - 1 - (i % N); // 从N-1到0循环
    }

    // 修剪当前索引的灌木
    Shrub[index] = 0; // 将灌木高度设为0
}

void Shrub_highest(int* Shrub, int* outcome, int N)//用outcome数组存放每棵灌木最大高度
{
    for (int i = 0; i < N; i++)
    {
        outcome[i] = (outcome[i] > Shrub[i]) ? outcome[i] : Shrub[i];//更新结果
    }
}

int main()
{
    int N;//灌木数量
    scanf("%d", &N);
    int Shrub[10001] = { 0 };//灌木实时高度数组
    int outcome[10001] = { 0 };//灌木最大高度数组

    for (int i = 0; i < 3*N; i++)
    {
        Shrub_grow(Shrub, N);
        //Shrub_highest(Shrub, outcome, N);//这里我的理解是生长之后记录最大高度,结果是错的
        Shrub_cut(Shrub, i, N);
        Shrub_highest(Shrub, outcome, N);//先修剪再检查
    }

    for (int i = 0; i < N; i++)
    {
        printf("%d\n", outcome[i]);//打印结果
    }
    return 0;
}

总结以及一些疑问

以上就是全部内容,简单介绍了C语言中数组的来回遍历以及在题目中的运用
我还有一个疑问就是

for (int i = 0; i < 3*N; i++)
    {
        Shrub_grow(Shrub, N);
        Shrub_cut(Shrub, i, N);
        Shrub_highest(Shrub, outcome, N);//先修剪再检查
    }

这个for循环的次数为什么是3N,可不可以是其他更小的次数?

标签:修剪,遍历,Shrub,int,灌木,C语言,数组,outcome
From: https://blog.csdn.net/vo1d_code/article/details/143109667

相关文章

  • 如何在C语言中使用外部库
    在C语言中使用外部库,首先,你需要找到你需要的库,这可以在网上或者在本地机器上,并获取库的路径。其次,你需要用预处理指令#include<库名.h>将库包含到你的程序中。最后,你需要在链接阶段,用-l库名将库链接到你的程序中。使用外部库可以方便地使用库中预定义的函数、变量和数据类型,这对......
  • 包装类型-数组Array方法
    数组Array使用详解认识数组(Array)◼什么是数组(Array)呢?对象允许存储键值集合,但是在某些情况下使用键值对来访问并不方便;比如说一系列的商品、用户、英雄,包括HTML元素,我们如何将它们存储在一起呢?这个时候我们需要一种有序的集合,里面的元素是按......
  • JS中数组的splice()方法介绍 及 用原生JS手写数组splice()方法
    一、splice是什么splice()方法是用来对数组进行增、删操作,该方法返回被删除的元素,改变原数组二、splice()方法接受三个及以上的参数:第一个参数:第一个参数是起始位置(数组的索引)第二个参数:第二个参数是要删除的元素个数,如果该参数是负数则默认为0第三个参数及往后参数:这些......
  • C语言实现 网络通信 Network
    在现代计算机网络中,网络通信是不可或缺的一部分。本文将介绍如何使用C语言实现一个简单的网络通信库,涵盖TCP和UDP协议的基本功能。我们将通过一个示例代码库进行详细讲解,以便更好地理解网络编程的核心概念。项目结构本项目包含两个文件:network.h:头文件,定义了数据结构和函数......
  • 2024-10-19:用go语言,给定一个正整数 k 和初始数组 nums = [1], 可以执行两种操作:将数组
    2024-10-19:用go语言,给定一个正整数k和初始数组nums=[1],可以执行两种操作:将数组中任一元素加一,或复制数组中任意元素并将其附加到数组末尾。求使得数组元素之和大于或等于k所需的最少操作次数。输入:k=11。输出:5。解释:可以对数组nums=[1]执行以下操作:将元......
  • 【趣学C语言和数据结构100例】
    【趣学C语言和数据结构100例】问题描述51.在一个递增有序的单链表中,存在重复的元素。设计算法删除重复的元素,例如(7.10.10.21.30.42.42.42.51.70)将变为(7.10.21.30.42.51.70)。52.设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法从A和B中的公共元素产......
  • mysql对结果集进行遍历(mysql双重for循环如何写)
    原文链接:mysql对结果集进行遍历(mysql双重for循环如何写)–每天进步一点点0.背景有这么一个需求:对以下的类型结果集进行更新。更新的原则是type为c的currentValue的值=(type为b的currentValue)/((type为b的currentValue)+(type为a的currentValue))*100。上面这个需求......
  • c语言:指针以及指针变量(一)
    目录地址有关地址的操作符取地址操作符&解引用操作符*指针变量指针的传参调用指针+-整数void*指针指针-指针野指针野指针成因指针未初始化指针越界访问指针指向的空间被释放防止出现野指针地址地址也就是我们常说的指针,在讲解指针前先讲个生活中的小例子,方便理......
  • 指针(二):数组指针巧妙玩法
    目录数组名的理解数组地址与数组首元素地址区别指针访问数组冒泡排序二级指针指针数组指针数组模拟二维数组数组名的理解在介绍数组指针之前先通过一段代码了解一下数组名的本质是什么。#include<stdio.h>intmain(){ intarr[]={1,2,3,4,5}; int*p1=......
  • C语言深入理解指针笔记(3)
    1.字符指针变量 我们已经了解的指针变量类型有:整形指针变量:int*pint:存放的是整型变量的地址浮点型指针变量:float*pf:存放的是浮点型变量的地址类比可知:char*pc:字符型指针变量:存放的是字符型变量的地址,指向字符型的数据 首先,字符型指针变量的使用有两种方法:......