洛谷P1157详解(两种解法,一看就会)

news2024/11/25 16:35:30

一、问题引出

组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从 n n n 个元素中抽出 r r r 个元素(不分顺序且 r ≤ n r \le n rn),我们可以简单地将 n n n 个元素理解为自然数 1 , 2 , … , n 1,2,\dots,n 1,2,,n,从中任取 r r r 个数。

现要求你输出所有组合。

例如 n = 5 , r = 3 n=5,r=3 n=5,r=3,所有组合为:

123 , 124 , 125 , 134 , 135 , 145 , 234 , 235 , 245 , 345 123,124,125,134,135,145,234,235,245,345 123,124,125,134,135,145,234,235,245,345

输入格式

一行两个自然数 n , r ( 1 < n < 21 , 0 ≤ r ≤ n ) n,r(1<n<21,0 \le r \le n) n,r(1<n<21,0rn)

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

注意哦!输出时,每个数字需要 3 3 3 个场宽。以 C++ 为例,你可以使用下列代码:

cout << setw(3) << x;

输出占 3 3 3 个场宽的数 x x x。注意你需要头文件 iomanip

样例 #1

样例输入 #1

5 3

样例输出 #1

1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5

二、解法一:拼接字符串,然后再cout

毫无疑问,这题肯定是深度优先搜索就能解决的问题,但与普通题目存在的一个不同点就是如何去按题中所述的要求去输出,在方法一当中我采用的是拼接字符串的方式,示意图如图所示:图中的cout并不是真正的cout,而是为了起一个示意的作用,由于篇幅有限,因此我只画出了一个深度方向上的。
方法一
有一个需要注意的点是,题中要求的是set(w)为3并按右对齐输出,由于我们这里是用字符串拼接的方式进行的,因此需要注意当数字为1位的时候我们要加2个空格,当数字为2位时加1个空格,代码如图所示:

#include <iostream>
#include <iomanip>
using namespace std;
int n,r,a[22];
void dfs(int m,string s,int startx)
{
    if (m==r)
    {
        cout<<s<<endl;
        return;
    }
    for (int i = startx; i <= n; i++)
    {
        string t;
        if (a[i]>9)
        {
            t=" "+to_string(a[i]);
        }
        else
        {
            t="  "+to_string(a[i]);
        }
        dfs(m+1,s+t,i+1);
    }
    return;
}
int main()
{
    cin>>n>>r;
    for (int i = 1; i <= n; i++)
    {
        a[i]=i;
    }
    dfs(0,"",1);
}

解法二:直接cout

直接cout时,虽然仍是采用深度优先的方式,但细节相比于上面就要做出改变了,
方法二
在此解法当中,我们的dfs函数当中的变量m充当了解法一当中变量m的作用,只不过我们此时是从1开始的(因为我们需要访问a[k-1],所以为了防止数组越界,k的值必须从1开始),此外我们的数组a的作用也与解法一有很大的不同:解法一的数组a是写死的,起一个访问元素的作用,但在此解法当中是动态变化的 ,并在每一步当中都对其赋予当前值。最终当我们成功访问了r个元素的时候我们就输出。
代码如下:

#include <iostream>
#include <iomanip>
using namespace std;
int n,r;
int a[22];
void dfs(int k)
{
    if(k>r)
    {
        for (int i = 1; i <= r; i++)
        {
            cout<<setw(3)<<a[i];
        }
        cout<<endl;
        return;
    }
    for (int i = a[k-1]+1; i <= n; i++)
    {
        a[k]=i;
        dfs(k+1);
    }
}
int main()
{
    cin>>n>>r;
    dfs(1);
}

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

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

相关文章

chatgpt赋能Python-pycharm桌面图标变白

PyCharm是一个非常流行的Python集成开发环境&#xff0c;它可以帮助Python开发人员更快更高效地编写代码。但是&#xff0c;有些用户可能会遇到一个问题&#xff1a;他们的PyCharm桌面图标突然变成了白色&#xff0c;而不是原来的彩色图标。在这篇文章中&#xff0c;我将详细介…

面试官:为什么有了sleep还需要wait?

1. 能不能调整线程先后顺序&#xff1f; 对于线程执行最大的问题就是随机调度&#xff0c;抢占式执行&#xff0c;对于程序猿来讲&#xff0c;是不喜欢这种随机性的&#xff0c;程序猿喜欢确定的东西&#xff0c;于是就有了一些方法&#xff0c;可以控制线程之间的执行顺序&…

Keil 手动添加自己的lib库

我是在做一个项目看蓝牙模块官方Demo程序时发现对库的使用&#xff0c; 库大家都知道是不需要编译的&#xff0c;而且别人是无法看到源代码的&#xff0c;这样的好处就是编译快&#xff0c;并且方便移植&#xff0c;更安全。 我的制作步骤如下&#xff1a; 1、首先要把整个工程…

大量电脑桌面文件一键批量复制移动

电脑桌面上的文件越来越多&#xff0c;处理起来越来越繁琐。如果需要把这些文件复制或移动到另一个文件夹中&#xff0c;手动一个个复制或移动不仅费时费力&#xff0c;还容易出错。那么有没有什么方法可以快速批量复制和移动这些文件呢&#xff1f;当然有&#xff01;今天小编…

若依前后端分离如何动态渲染echarts图表

本章教程,主要介绍一下如何在若依前后端分离框架中,进行echarts动态渲染数据。 ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。…

027python-ddt

在unittest中&#xff0c;测试用例是不能传self以外的参数的&#xff0c;否则会报错import unittestclass TeatMath(unittest.TestCase):# def test_add(self,q): # TypeError: TeatMath.test_add() missing 1 required positional argument: q——>测试用例传参报错def t…

【KD-Tree】基于k-d树的KNN算法实现

文章目录 一、什么是KD-Tree&#xff1f;二、k-d树的结构三、k-d树的创建四、k-d树的应用五、KD-Tree的优缺点 例题JZPFAR 一、什么是KD-Tree&#xff1f; KD-Tree&#xff0c;又称&#xff08;k-dimensional tree&#xff09;&#xff0c;是一种基于二叉树的数据结构。它可以…

大项目推进

拉取最新的小组分支&#xff0c;创建自己开发分支&#xff08;对应实现人&#xff09; 任务分支&#xff08;小组名-功能名-执行人&#xff0c;如&#xff1a;f1-login-zhangfei&#xff09; 根据业务流程整理文档梳理与书写 定义领域模型&#xff08;包括&#xff1a;query、…

通用医学人工智能基础模型(GMAI)

最近&#xff0c;Eric J. Topol和 Pranav Rajpurkar研究团队提出了一个通用医学人工智能基础模型&#xff0c;文章名字《Foundation models for generalist medical artificial intelligence》 模型研究进展包括&#xff1a;多模态架构&#xff0c;和自监督学习技术&#xff0…

知识库AI机器人客服接口对接-唯一客服系统文档中心

如果你的需求仅仅是对接自训练的ChatGPT接口&#xff0c;实现自己的个性化机器人&#xff0c;那么可以看看下面的个性化ChatGPT调用接口前提条件是已经搭建好了知识库服务&#xff0c;该服务默认监听端口8083 chat接口地址 POST http://127.0.0.1:8083/data_collection/searchS…

“伙伴+华为”体系,数字时代的新航标

如果从1994年中国实行税制改革&#xff0c;要求以“以计算机网络为依托”开展企业税务工作算起&#xff0c;转瞬间&#xff0c;中国企业的信息化、数字化建设已经走过了近三十年历程。 这期间&#xff0c;信息化、数字化成为了企业走向管理现代化、全球化的依托&#xff0c;成为…

最新版本的Android studio 集成高德地图的定位功能

android studio版本&#xff1a; 1、根据高德官网链接集成 2、配置key的时候有两个注意点&#xff1a; a .获取安全SHA1 根据高德推荐的方式获取时&#xff0c;可能C:\Program Files\Android\Android Studio\jre\bin目录下找不到keytool.exe; 可以根据以下方式获取&#xff1…

华为新模拟器eNSPLite下载,部署教程及产品使用文档

华为新模拟器eNSPLite下载&#xff0c;部署教程及产品使用文档 如需下载请到我的博客中下载 硬件要求 数通培训认证模拟器支持在个人PC和物理服务器上部署安装&#xff0c;如下所示。 硬件推荐配置CPUX86_64架构CPU&#xff0c;支持VT-x/AMD-V 8核或以上RAM16G或以上DISK40G以…

数据库信息速递 支持机器学习的10个数据库 (译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

Spring:自动装配 Bean 的两种方式、使用注解开发

文章目录 Spring&#xff1a;Day 02一、自动装配 Bean1. 搭建环境2. 自动装配方式一&#xff1a;xml 配置3. 自动装配方式二&#xff1a;注解 二、注解开发三、使用 JavaConfig 实现配置 Spring Spring&#xff1a;Day 02 一、自动装配 Bean 在 Spring 中有三种装配的方式&am…

PostgreSQL表用户列最大个数

PostgreSQL表用户列最大个数 有些业务可能有这么个需求&#xff1a;需要增加用户列&#xff0c;即通过ALTER TABLE ... ADD...来添加用户列。那么PG/GP中是否会有列个数的限制呢&#xff1f; 它有1600列数的限制&#xff0c;并且没有方法去除掉这个限制。参见&#xff1a; http…

千年平阴玫瑰,绽放数字新魅力

“人间美景五月天、玫瑰花放霞流丹。” 每年的五月&#xff0c;济南市平阴县总是一幅玫瑰花芳香如海的迷人景象。作为中国玫瑰之乡&#xff0c;平阴地处古东原之阴&#xff0c;位于北纬36度“玫瑰种植黄金带”之上&#xff0c;这里土肥地沃、气候温和&#xff0c;属暖温带大陆…

Netty实战(四)

本节我们看看Netty的传输&#xff08;全是干货&#xff0c;自带水杯&#xff09; 一、Java的NIO和OIO1.1 OIO1.2 NIO 二、Netty的NIO和OIO2.1 OIO2.2 NIO 三、传输API四、内置的传输4.1 NIO4.2 Epoll—用于 Linux 的本地非阻塞传输4.3 OIO4.4 用于 JVM 内部通信的 Local 传输4.…

chatgpt赋能Python-pycharm如何关联python

PyCharm如何关联Python 作为一款被广泛使用的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm为Python程序员提供了丰富的开发工具和功能。在开始使用PyCharm之前&#xff0c;我们需要确保PyCharm已经正确地关联了Python。在本篇文章中&#xff0c;我们将介…

chatgpt赋能Python-pycharm访问网页

PyCharm访问网页的SEO技巧 PyCharm是一款强大且广受欢迎的Python开发环境&#xff0c;它提供了许多优秀的工具和功能&#xff0c;以便于Python项目的开发和管理。其中一个强大的功能是PyCharm可以访问网页&#xff0c;可以使你快速获取和分析数据。但是&#xff0c;在使用这个…