牛客——递归实现指数型枚举(枚举,dfs)

news/2024/5/19 0:29:30 标签: 算法, 枚举, dfs

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

从 1∼n1\sim n1∼n这 n (n≤16)(n \leq 16)(n≤16) 个整数中随机选取任意多个,输出所有可能的选择方案。

输入描述:

一个整数n。

输出描述:

每行一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int i=0;i<(1<<n);i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(i>>j&1)
            {
                cout<<j+1<<' ';
            }
        }
        cout<<endl;
    }
	return 0;
}

这个题就是枚举,可以结合二进制的特点来看。

每一个数的存在与否就看成0和1,那么就有2的n次方种。

接着就是要找二进制数中为1的输出j+1就可以。

另外还可以用dfs来做。

#include<bits/stdc++.h>
using namespace std;
int n;
bool st[100]={false};
void dfs(int u){
    if(u>n){
        for(int i=1;i<=n;i++)
            if(st[i])
               cout<<i<<" ";
            cout<<endl;
            return;
    }
    st[u]=true;
    dfs(u+1);//选择当前分支

    st[u]=false;
    dfs(u+1);//不选当前分支

}

int main(){
	cin>>n;
	dfs(1);
	return 0;
}

另外,还有一个拓展:

题目描述

把 1∼n这 n(n<10)个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入描述:
一个整数n。
输出描述:
按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

示例1

输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

void dfs(int u){
   if(u==n+1){                 //递归边界,已经处理完排列的1~n位
       for(int i=1;i<=n;i++)
           cout<<P[i]<<" ";   //输出当前排列
       cout<<endl;
       return ;
   }
   for(int i=1;i<=n;i++){    //枚举1~n,试图将x填入P[u]中,
       if(st[i]==false){     //如果不在P[0]~P[u-1]中,
           P[u]=i;           //将P的第u位为i,即将i加入到当前排列
           st[i]=true;       //记i已经在u号位
           dfs(u+1);       //处理排列载=在第u+1号位
           st[i]=false;       //已经处理完P[u]为i的子问题,还原
       }
   }
}

 


http://www.niftyadmin.cn/n/5375258.html

相关文章

网络协议、网络传输认识

目录 网络协议概念 网络协议具象化理解 协议分层 TCP/IP模型 网络传输基本流程 网络协议概念 网络协议是计算机网络中用于在通信设备之间传输数据的规则集合。这些规则定义了数据的格式、传输方式、错误检测和纠正方法等&#xff0c;以确保不同设备之间的通信能够正确进行…

力扣(LeetCode)数据结构练习题

今天来分享两道力扣&#xff08;LeetCode&#xff09;的题目来巩固上篇时间复杂度和空间复杂度的知识&#xff0c;也就是在题目上加上了空间复杂度和时间复杂度的限制。 目录 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c…

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色&#xff1b; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺&#xff08;默认&#xff09;no-repeat 不平铺repeat-x 水平平铺repea…

数据结构——6.3 图的遍历

6.3 图的遍历 一、概念 图的广度优先遍历 树的广度优先遍历&#xff08;层序遍历&#xff09;&#xff1a;不存在“回路”&#xff0c;搜索相邻的结点时&#xff0c;不可能搜到已经访问过的结点&#xff1a; 若树非空&#xff0c;则根节点入队 若队列非空&#xff0c;队头元素…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域&#xff0c;从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景&#xff0c;比如多个进程需要…

Java的Cloneable接口和深拷贝

Java 中内置了一些很有用的接口, Clonable 就是其中之一。 Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝"。 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。 浅拷贝&#xff…

如何使用 Python 创建 Twitter 应用程序

简介 通过访问 Twitter API&#xff0c;您可以管理社交媒体账户&#xff0c;并且可以从社交媒体中获取数据。如果您代表一个企业或组织&#xff0c;这对品牌推广很有帮助&#xff1b;对于个人用户和业余程序员来说&#xff0c;这也可以是一种有趣的娱乐方式。 在本文中&#…

1002: 【C1】【一维数组】【入门】数组逆序

题目描述 给你n个整数&#xff0c;将其逆序输出 输入 第一行&#xff1a;一个整数n。(1<n<100) 第二行&#xff1a;n个空格隔开的整数。 输出 n个空格隔开的整数 样例输入 3 1 7 5 样例输出 5 7 1 提示 来源 Code: #include<bits/stdc.h> using names…