【算法】【算法杂谈】折纸问题(完全二叉树解法)

news2024/9/21 20:44:04

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
一张纸从下往上对折之后,出现一条折痕,该折痕凸起向下,所以叫“下折痕”,反之如果摊开之后,凸起向上,则叫上折痕。
如果一张纸从下往上对折两次,则折痕为 [下,下,上]如下图所示
在这里插入图片描述
问:
给定整数num,表示这张纸按照从下往上折叠的方式折叠num次,摊开之后,从上往下的折痕方向顺序是什么?
如:
num = 2
结果为:下下上

解决方案

原问题
1、首先想一个问题,如果当前纸有一个向下的折痕,那么对于向下的折痕,我们再次对折时,在下面的纸张摊开后会形成向下的折痕,在上面的纸张会形成向上的折痕,因此我们能够确定,对于每一个向下的折痕都有这个规律
2、同理我们也可以发现,对于折叠好的向上的折痕,如果我们再次折叠会出现 下上上
3、综合上面,还有一个规律就是每一次的折叠都是对当前折痕中的上上下下再次进行折叠,所以通过当前折痕是上和下即可判断出折好之后的三元组是什么,如当前折痕是下,那么折叠好摊开一定是 下下上三元组,如果是上,那么一定是下上上三元组。
4、理解了上面三条我们就很容易的可以使用完全二叉树来进行折纸问题的计算,下图是折叠三次的示例
在这里插入图片描述

自己可以拿一张纸来折叠一下看看是不是这个规律,整体的就是这个完全二叉树的中序遍历!

代码编写

java语言版本

原问题:
方法一:

     /**
     * 二轮测试:纸张折叠num次之后,打印折痕
     * @param num
     */
    private static void printAllFoldersCp1(int num) {
        if (num <= 0) {
            return;
        }
        processCp1(num, null, null);
    }

    /**
     * 中序遍历,递归打印折痕
     * @param num
     * @param parent 父节点是上还是下
     * @param isLeft 是否左子节点
     */
    private static void processCp1(int num, Boolean parent, Boolean isLeft) {
        if (num == 0) {
            // 已经减到0了直接返回
            return;
        }
        Boolean cur = false;
        // 先判断自己的是上还是下
        if (parent == null || isLeft == null) {
            // 根节点直接下
            cur = false;
        }else if (!parent && isLeft) {
            // 根节点是下并且自己是左子树
            cur = false;
        }else if (!parent && !isLeft) {
            // 根节点是下,并且自己是右子树
            cur = true;
        }else if (parent && isLeft) {
            // 上左子树
            cur = false;
        }else if (parent && !isLeft) {
            cur = true;
        }
        // 判断完成后开始下一轮
        processCp1(num - 1, cur, true);
        // 输出自己
        System.out.println(cur ? "上" : "下");
        // 输出右边
        processCp1(num - 1, cur, false);
    }


    public static void main(String[] args) {
        printAllFolders(4);
    }

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

发现规律是一个难点:这个规律文字其实解释起来很麻烦,但是如果自己找一张纸折叠一下就会发现其实过程就是一个递归的过程,
对折这个动作就非常的“递归”,当对折的时候折痕两边的纸片都会被折叠,同样是折叠,只是下面的纸片向上折叠,而上面的纸片其实是一个向下折叠的过程,因为摊开的过程是一个翻转的过程,这个需要自己去慢慢体会一下
构造遍历方式也是一个难点:第一想法是先构造一个完全二叉树再遍历,如此一来,感觉有点憨憨
那么接下来如何能够节省空间的中序遍历呢?
首先num = 3, 我们认为root节点高度为3,那么整体的顺序为 左子树 -> root -> 右子树
其次,构造递归函数的入参,第一个入参:num不解释,第二个入参,parent,第三个入参当前是左子节点还是右子节点
因为只有知道自己的父节点和自己的位置是左边还是右边才能计算出来自己当前应该是上还是下。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/465571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Camunda8流程引擎私有化安装部署快速入门

Camunda8是基于标准云原生架构设计开发的&#xff0c;所以官方优先推荐基于Kubernetes和docker的方式安装部署Camunda8&#xff0c;考虑到大部分开发者不一定具备Kubernetes环境和云原生相关知识&#xff0c;所以本文介绍如何在一台windows机器下手动安装运行Camunda8的方式&am…

Linux文件操作基础及基本I/O函数使用

文章目录 前言一、基础命令简单讲解二、文件描述符三、open、read、write函数讲解1.open函数2.read函数3.write函数 四、使用open、read、write操作标准输入输出总结 前言 Linux是一个基于文件系统的操作系统&#xff0c;文件操作是其中一项最基本的任务之一。通过文件操作&am…

什么!appium安装不上???快来试试这种方法吧!——appium的手动安装步骤教程

前言 相信你不少软件测试行业小伙伴应该在用npm安装appuim或者是cpm安装appuim途中也碰到下面一些报错吧&#xff0c;接下来小陈教你改为手动安装appium吧。 一、手动下载appium安装包 appuim手动安装包下载链接&#xff1a; appium / Appium.app / Downloads — Bitbucket &a…

《Netty》从零开始学netty源码(四十四)之PoolChunk释放内存

free 当PoolChunk需要释放内存空间时可调用free方法&#xff0c;具体的源码过程如下&#xff1a; 在这个过程中最重要的是第三步的collapseRuns方法&#xff0c;当释放了空间以后要更新runsAvail和runAvailsMap的信息&#xff0c;如果handle对应的内存空间的上边界以及下边界是…

什么是AMS?什么是WMS?

AMS和WMS AMS ActivityManagerService是Android系统中一个特别重要的系统服务&#xff0c;也是上层APP打交道最多的系统服务之一&#xff08;几乎所有的APP应用都需要与AMS打交道&#xff09;。 AMS与操作系统中的进程管理和调度模块很像&#xff0c;在Android系统中非常重要…

从“恰当”的项目管理工具中,了解自己的缺点

项目管理工具是为了帮助管理者&#xff0c;但管理者需要了解自己在特定情况下的“缺点”&#xff0c;才能从“恰当”的工具中获得“恰当”的帮助。如果你不知道在某个特定项目中自己&#xff08;作为项目经理&#xff09;的缺点&#xff0c;也不知道自己需要利用哪些好用的项目…

【Python_Opencv图像处理框架】边缘检测、轮廓检测、图像金字塔

写在前面 本篇文章是opencv学习的第四篇文章&#xff0c;主要讲解了边缘及轮廓检测的主要操作&#xff0c;并对两种图像金字塔简单的介绍了一下&#xff0c;作为初学者&#xff0c;我尽己所能&#xff0c;但仍会存在疏漏的地方&#xff0c;希望各位看官不吝指正&#x1f60d; …

Kafka3.0.0版本——生产者数据有序与乱序

目录 一、生产经验数据有序二、生产经验数据乱序2.1、kafka1.x版本之前保证数据单分区有序的条件2.2、kafka1.x版本及以后保证数据单分区有序的条件2.3、kafka1.x版本及以后开启幂等性数据单分区有序的原因 一、生产经验数据有序 单分区内&#xff0c;数据有序。如下图partion…

React之购物车+动态获取参数+Hooks+Redux

1、redux-logger中间件 1️⃣&#xff1a;安装redux-logger依赖包 yarn add redux-logger 2️⃣&#xff1a;在store的配置文件index中配置 import {legacy_createStore as applyMiddleware,applyMiddleware} from reduximport counterReducer from ./counterReducerimport {c…

【论文写作】-我的第一篇论文形成记(投稿过程、课题来源、python与数学学习、实验设计、论文思路建立与写作、回复审稿人)

我的第一篇论文形成记 投稿过程背景记录课题来源-本科毕业设计python及数学学习实验设计调参阶段实验阶段 论文思路建立论文写作回复审稿人总结 投稿过程 2022年12月28日 投AIChE 2023年01月05日 AlChE编辑认为方向不太符合期刊定位&#xff0c;建议投其他期刊 2023年01月06日…

SpringCloud_服务调用OpenFeign和断路器Resilience4J

文章目录 一、负载均衡概论1、服务器负载均衡2、客户端负载均衡3、客户端负载均衡策略(SpringCloudRibbon)4、客户端负载均衡策略(SpringCloudLoadBalancer) 二、SpringCloudOpenFeign服务调用1、OpenFeign服务调用的使用2、OpenFeign服务调用的日志增强3、OpenFeign服务调用超…

Vector - CAPL - 检查DUT发出与dbc定义一致

目录 ChkCreate_UndefinedMessageReceived 代码示例 有回调函数 无回调函数 Trace报文 报告显示 ChkCreate_UndefinedMessage

一维离散小波变换原理和代码实现

基本原理&#xff1a; 离散小波变换&#xff1a;对连续小波变换的尺度因子和时移动因子采用不同的离散条件进行离散&#xff0c;得到Discrete Wavelet Transform(DWT)。降低计算量的同时&#xff0c;保持连续小波变换的光滑性、紧支性、对称性。 离散小波函数&#xff1a; ψ…

脚本函数基础

shell脚本编程系列 函数是一个脚本代码块&#xff0c;可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时&#xff0c;直接写函数名即可。称作调用函数。 创建函数 方式1&#xff1a; function name {commands }name定义了该函数的唯一名称&#xff0…

私有部署、重构企业软件,第四范式发布大模型“式说”

大模型领域再添重要一员&#xff01; 4月26日&#xff0c;第四范式首次向公众展示其大模型产品「式说3.0」&#xff0c;并首次提出AIGS战略&#xff08;AI-Generated Software&#xff09;&#xff1a;以生成式AI重构企业软件。式说将定位为基于多模态大模型的新型开发平台&…

ImageJ 用户手册——第五部分(菜单命令Process)

这里写目录标题 ImageJ 用户手册——第五部分29. Process29.1 Smooth29.2 Sharpen29.3 Find Edges29.4 Find Maxima29.5 Enhance Contrast29.6 Noise29.6.1 Add Noise29.6.2 Add Specified Noise29.6.3 Salt and Pepper29.6.4 Despeckle29.6.5 Remove Outliers29.6.6 Remove Na…

Shell编程条件语句 if case (愿此行终抵群星)

一、Shell条件语句 Shell环境根据命令执行后的返回状态值&#xff08;$?&#xff09;来判断是否执行成功&#xff0c;当返回值为0(真 true)时表示成功&#xff0c;返回值为非0值&#xff08;假 false)时表示失败或异常。 test 命令 更多操作可使用 man test 查看 1.条件表达式…

深度学习论文分享(二)Data-driven Feature Tracking for Event Cameras

深度学习论文分享&#xff08;二&#xff09;Data-driven Feature Tracking for Event Cameras&#xff08;CVPR2023&#xff09; 前言Abstract1. Introduction2. Related Work3. Method3.1. Feature Network3.2. Frame Attention Module3.3. Supervision 4. Experiments5. Con…

焕新时刻,移动云品牌升级燃动十一城

4月25日&#xff0c;在2023移动云大会上&#xff0c;移动云品牌形象全方位焕新&#xff0c;启用新品牌LOGO和品牌标语&#xff0c;在政府领导、院士专家、行业大咖等3000多位参会嘉宾见证下&#xff0c;吹响品牌进阶新号角。 24日晚&#xff0c;移动云品牌焕新亮灯仪式率先在苏…

C语言入门篇——指针篇

目录 1、指针 1.1内存地址 1.2基地址 1.3指针变量 2、指针类型 2.1指针-整数 2.2指针的解引用 3、特殊指针 3.1野指针 3.2空指针 4、指针运算 4.1指针-指针 4.2指针的关系运算 5、指针和数组 6、二级指针 7、指针数组 1、指针 1.1内存地址 内存是电脑上特别重…