ACAG 0x02-8 非递归实现组合型枚举

之所以专门来写这道题的博客,是因为感觉从最根本处了解到了递归的机器实现。

主要的就是两个指令——CallRet

Call指令会将返回地址入栈(系统栈),然后跳转到$address$位置的语句。

Ret指令就是返回指令(Return),将返回地址出栈,并跳转到该位置继续执行。

综上,就可以得到组合型枚举的非递归实现了。

#include<bits/stdc++.h>

using namespace std;

int n,m,top,address;
int sta[100010]; vector <int> v; void Call(int x,int ret_addr) {
int old_top=top;
sta[++top]=x;
sta[++top]=ret_addr;
sta[++top]=old_top;
return;
} int Ret() {
int ret_addr=sta[top-1];
top=sta[top];
return ret_addr;
} void Recursive() {
Call(1,0);
while(top) {
int x=sta[top-2];
switch(address) {
case 0:
if(v.size()>m||v.size()+(n-x+1)<m) {
address=Ret();
continue;
}
if(x==n+1) {
for(int i=0;i<v.size();i++) {
printf("%d ",v[i]);
}
printf("\n");
address=Ret();
continue;
}
v.push_back(x);
Call(x+1,1);
address=0;
continue;
case 1:
v.pop_back();
Call(x+1,2);
address=0;
continue;
case 2:
address=Ret();
continue;
}
}
return;
} int main()
{
scanf("%d%d",&n,&m);
Recursive();
return 0;
}

ACAG 0x02-8 非递归实现组合型枚举的更多相关文章

  1. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

  2. AcWing 93. 递归实现组合型枚举

    AcWing 93. 递归实现组合型枚举 原题链接 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的 ...

  3. ACWing93.递归实现组合型枚举

    题面 \93. 递归实现组合型枚举 从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案 ...

  4. 【指数型母函数+非递归快速幂】【HDU2065】"红色病毒"问题

    大一上学完数分上后终于可以搞懂指数型母函数了.. 需要一点关于泰勒级数的高数知识 题目在此: "红色病毒"问题 Time Limit: 1000/1000 MS (Java/Oth ...

  5. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  6. 快速排序partition过程常见的两种写法+快速排序非递归实现

    这里不详细说明快速排序的原理,具体可参考here 快速排序主要是partition的过程,partition最常用有以下两种写法 第一种: int mypartition(vector<int& ...

  7. 【Java】 归并排序的非递归实现

    归并排序可以采用递归方法(见:归并排序),但递归方法会消耗深度位O(longn)的栈空间,使用归并排序时,应该尽量使用非递归方法.本文实现了java版的非递归归并排序. 更多:数据结构与算法合集 思路 ...

  8. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  9. C语言递归,非递归实现翻转链表

    翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #inc ...

随机推荐

  1. 细说RESTful API之幂等性

    目录 接口幂等性的含义 接口符合幂等性有什么用处 HTTP方法的幂等性与安全性 如何设计符合幂等性的接口 写在最后 接口幂等性的含义 幂等性原本是数学中的含义,表达式的是N次变换与1次变换的结果相同. ...

  2. 安装 mysql-5.6.41-winx64

    REF:https://www.cnblogs.com/cwb292/p/9888039.html https://dev.mysql.com/get/Downloads/MySQLInstaller ...

  3. Spring boot启动成功后输出提示

    添加logback-spring.xml,将log输出到文件,控制台输出的level改为error因此只会出处banner src/main/resources/banner.txt的内容为 star ...

  4. Zero-shot User Intent Detection via Capsule Neural Networks

    Architecture                 SemanticCaps 通过Bi-LSTM表征得到的隐层向量经过multi-head后可以得到R个表征             Detect ...

  5. GitHub: Oracle RAC Database on Docker 未测试 改天试试

    https://github.com/oracle/docker-images/blob/master/OracleDatabase/RAC/OracleRealApplicationClusters ...

  6. GitLabCICD

    CI/CD是什么 CI全名Continuous Integration,啥意思?就是我们经常听到的持续集成概念.当开发每天会提交多次代码到主干上,会做一些重复性的动作时,就可以用持续集成环境来操作.有 ...

  7. SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

     下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表 ...

  8. Listener学习

    监听器Listener用于监听web应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.常用于统计 ...

  9. 基于DigitalOcean+LAMP+WordPress搭建个人网站

    1. 注册DigitalOcean并新建主机 为了搭建个人网站首先需要一个可以在公网范围访问的主机,可以选用国内如阿里云.国外如DigitalOcean的各种云主机提供商,这里选用DigitalOce ...

  10. Linux基础(06)IO复用

    在Windows文件指的就是普通的肉眼可见的文件 , 而Linux一切皆文件 https://blog.csdn.net/nan_nan_nan_nan_nan/article/details/812 ...