[递归 dfs]枚举全排列和所有组合

news/2025/2/22 7:32:48

1.全排列

例题:洛谷P1706 全排列问题

题目描述

输出自然数 1 到 n 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n。

输出格式

由 1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 个场宽。

输入输出样例

输入

3

输出 

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

说明/提示

1≤n≤9

解答:

#include<iostream>
#include<cstdio>
using namespace std;

int N;
int a[10000],book[10000];

void dfs(int step)
{
	if(step==N+1)
	{
		for(int i=1; i<=N; i++)
		{
			printf("%5d",a[i]);
			//cout<<a[i]<<' ';
		} 
		cout<<endl;
		return ;
	}
	for(int i=1; i<=N; i++)
	{
		if(book[i]==0)
		{
			a[step]=i; 
			book[i]=1;
			dfs(step+1);
			book[i]=0;
		} 
	} 
	return ;
}
int main()
{	
	cin>>N;
	for(int i=1;i<=N;i++)
	{
		a[i]=i;
		book[i]=0;
	}
	dfs(1);

	return 0;
}

模板:

void dfs(int step)
{
    判断边界{
        ...// 输出
        返回 
    } 
    尝试每一种可能{
        判断状态{
            ...
            继续下一步 dfs(step+1) 
            ...//初始化执行这一步前所改变的状态
        }  
    } 
    返回 
}

2.所有组合

例题:洛谷P1157 组合的输出

 

题目描述

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

现要求你输出所有组合。

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

12 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

输入格式

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

输出格式

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

注意输出时,每个数字需3个场宽,pascal可以这样:

write(ans:3);

输入输出样例

输入 

5 3 

输出

  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

解答:

#include<iostream>
#include<cstdio>
using namespace std;

int n,r;
int a[10000];

void dfs(int m)
{
	if(a[0]==r)
	{
		for(int i=1; i<=r; i++)
		{
			printf("%3d",a[i]);
			//cout<<a[i]<<' ';
		} 
		cout<<endl;
		return ;
	}
	for(int i=m; i<=n; i++)
	{
		a[++a[0]]=i;
		dfs(i+1);
		a[a[0]--]=0;
	} 
}
int main()
{	
	cin>>n>>r;
	dfs(1);
	return 0;
}


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

相关文章

Angular 样式绑定

1. style.propertyName [style.Css属性名] Css属性值变量/"css属性值" // app.component.ts export class AppComponent {fontSize 32px; }// app.component.html <div [style.fontSize]"fontSize" [style.color]"red">styleBinding<…

2021-07-09 AcWing 3762. 二进制矩阵

输入样例&#xff1a; 5 2 2 10 11 3 3 011 101 110 4 4 1111 0110 0110 1111 5 5 01011 11001 00010 11011 10000 2 3 011 101输出样例&#xff1a; 1 1 1 2 1 2 2 2 2 1 3 1 3 2 1 2 1 3 2 3 4 1 1 1 2 2 2 1 3 1 4 2 3 3 2 4 1 4 2 3 3 4 3 4 4 4 1 2 2 1 2 2 1 4 1 5 2 …

洛谷P1613 跑路

传送门啦 分析&#xff1a; 这个题看很多人都在用Floyd和倍增的方法来做的。 那我就用spfa来跑最短路吧 a[i][j][k]:表示从i到j是否存在长2^k的边。 预处理的时候就将这些边赋值成1 &#xff08;长2^k的边&#xff09;&#xff08;再补充一下&#xff1a;这些边用1s就能走完&am…

2021-07-10 AcWing第 7 场周赛 3759. 第k个字符串

#include<iostream> using namespace std;int main() {int t,a,b;int m,n;cin>>t;while(t--){cin>>a>>b;for(int ia-1; i; i--){if(b>a-i){b - a-i;}else{string s(a,a);s[i-1]s[a-k]b;cout<<s<<endl;break;}}}return 0; }

python学习 (三十四) Python文件操作

1 写文件 my_list ["1", "2", "3"]my_file open("myfile.txt", "w")for item in my_list:my_file.write(item "\n") my_file.writelines(my_list) // 写多个my_file.close() 2 读文…

[转载]由数据范围反推算法复杂度以及算法内容

转自y总:由数据范围反推算法复杂度以及算法内容

htmlUnit加持,网络小蜘蛛的超级进化

前言 前段时间写了个小说线上采集阅读&#xff08;猛戳这里&#xff1a;https://www.cnblogs.com/huanzi-qch/p/9817831.html&#xff09;&#xff0c;当我们去采集起点网的小说目录时发现目录数据没有在html里面&#xff0c;数据是页面加载时&#xff0c;用ajax请求获取&#…