算法--递归

news/2024/7/20 20:54:55 标签: 算法, 深度优先, 图论, c++

NO.1 递归实现指数型枚举

从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 n

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 1

个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1≤n≤15

输入样例:

3

输出样例:


3
2
2 3
1
1 3
1 2
1 2 3

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 16;

int n;
int st[N];
//st 记录状态 0->没有考虑 1->选 2->不选

void dfs(int u){
	if(u > n){
		for(int i = 1;i <= n;i ++)
			if(st[i] == 1)
				printf("%d ",i);
		printf("\n");
		return;
	}
	st[u] = 2;
	dfs(u + 1); //第一个分支:不选
	st[u] = 0; //恢复现场
	
	st[u] = 1;
	dfs(u + 1); //第二个分支:选
	st[u] = 0;
}
int main(){
	cin >> n;
	dfs(1);
	return 0;	
}

 NO.2 递归实现排列型枚举   

把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数 n

输出格式

按照从小到大的顺序输出所有方案,每行 1

个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1≤n≤9

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

方法一:暴搜(dfs)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N = 10;
int n;
int st[N]; //0 -> 没有放数  1~n -> 放了哪个数
bool used[N]; //true -> 用过 false -> 未用过

void dfs(int u){
	if(u > n){ // 边界
		for(int i = 1;i <= n;i ++){ // 打印方案
			cout << st[i];
		}
		cout << endl;
		return;
	}

	// 依次枚举每个分支,即当前位置可以填哪些数
	for(int i = 1;i <= n;i ++){
		if(!used[i]){
			st[u] = i;
			used[i] = true;	
			dfs(u + 1);
			//恢复现场
			st[u] = 0;
			used[i] = false;
		}
	}
}

int main(){
	cin >> n;
	dfs(1);
	return 0;
}
//next-permutation
方法二:next-permutation函数 (头文件algorithm)
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

int n;
const int N = 16;
int a[N];

int main(){
	cin >> n;
	for(int i = 1;i <= n;i ++)
		a[i] = i;
	
	do{
		for(int i = 1;i <= n;i ++){
			cout << a[i] << " ";
		}
		cout << endl;
	}
	while(next_permutation(a+1 , a+1+n));

	return 0;
}


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

相关文章

我国.BIZ域名总量5.3万居全球第7:1月第三周增425个

IDC评述网&#xff08;idcps.com&#xff09;02月07日报道&#xff1a;据国外域名统计机构WebHosting.info数据&#xff0c;截至2014年1月20日&#xff0c;我国域名注册总量达到了7,362,322个。其中&#xff0c;.BIZ域名占52,731个&#xff0c;位居全球第7名&#xff0c;1月第三…

350. Intersection of Two Arrays II

https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ 求两个数组交集&#xff0c;要求包括重复元素。 思路&#xff1a;相比于349. Intersection of Two Arrays&#xff0c;此时不能再用交集来求&#xff0c;因为集合不包含重复元素。对两个数组排序&…

Codeforces 385E Bear in the Field(矩阵快速幂)

题目链接&#xff1a;Codeforces 385E Bear in the Field 题目大意&#xff1a;有一片n*n的草莓地&#xff0c;每个位置的初始草莓量为横坐标和纵坐标的和&#xff0c;然后每过一秒增长一个草莓。然后给出熊的初始位置&#xff08;sx&#xff0c;sy&#xff09;&#xff0c;以及…

Android Browser学习二 BrowserActivity 的初始化 --其他重要模块

2019独角兽企业重金招聘Python工程师标准>>> BrowserActivity 是浏览器的核心Activity了, 是浏览器的入口, 但是他里面并没有出来很多复杂的逻辑, 只是实现一些android 系统对activity的回调. 这些逻辑交给了Controller来处理, 就让我们一步一步的来看看浏览器是怎…

STL之heap

heap并不归属与STL容器组件&#xff0c;它是个幕后英雄&#xff0c;扮演priority queue的助手。 heap在algorithm头文件中实现&#xff0c;sgi把它放在了stl_heap.h中。 共有4个操纵heap的函数&#xff0c;分别是&#xff1a; push_heap, pop_heap, make_heap, sort_heap堆的…

关于shell脚本编程的10个最佳实践

每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程。但大家解决问题的方式却不尽相同&#xff0c;这要取决于对专业知识的掌握程度、使用命令的种类、看待问题的方式等等。对于那些处在shell脚本编程初级阶段的程序员来说&#xff0c;遵循一些恰当的做法可以帮助你更快…

Codeforces 385D Bear and Floodlight(几何+dp)

题目链接&#xff1a;Codeforces 385D Bear and Floodlight 题目大意&#xff1a;给出一个区间[l, r],然后给出n个探照灯&#xff0c;问说n个探照灯能照到区间[l,r]的最大范围。 解题思路&#xff1a;用二进制表示说哪些灯被选中了&#xff0c;dp[i]表示这些灯能够照到的最大范…

汤姆大叔设计模式学习体会:设计模式的思想

汤姆大叔的教程地址&#xff1a;http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html&#xff0c;谢谢大叔。 1、单例模式 核心是该对象只存在一个实例&#xff0c;要么直接写成实例的形式&#xff0c; 要么就需要写成构造函数形式&#xff0c;但是需要在构造函数里…