用dfs实现1到n的全排列

用dfs实现1到n的全排列。

我的做法是从第一个位置开始,用dfs找每个位置的数就好,

在某个位置的时候,从小到大枚举1到n的所有数,如果碰到

某个数之前没被用到就在这个位置选择这个数,然后搜索下个

位置的数值。

我的代码如下:

#include<iostream>
#include<cstring>
using namespace std;
int perm[10000],used[10000],num;
void init()
{
	int i;
	memset(used,0,sizeof(used));
	scanf("%d",&num);
	for(i=0;i<num;i++)
		perm[i]=i+1;
}
void out()
{
	int i;
	for(i=0;i<num;i++)
	{
		if(i)
			printf(" ");
		printf("%d",perm[i]);
	}
	printf("\n");
}
void dfs(int pos)
{
	int i;
	if(pos==num)
	{
		out();
		return;
	}
	for(i=1;i<=num;i++)
		if(!used[i])
		{
			perm[pos]=i;
			used[i]=1;
			dfs(pos+1);
			used[i]=0;
		}
}
void permutation()
{
	init();
	dfs(0);
}
int main()
{
	permutation();
}

用dfs实现1到n的全排列

时间: 2024-08-12 21:53:14

用dfs实现1到n的全排列的相关文章

ZOJ Problem Set - 3861 ( DFS + 子集生成 + 有条件的全排列生成 )

Valid Pattern Lock -------------------------------------------------------------------------------- Time Limit: 2 Seconds      Memory Limit: 65536 KB -------------------------------------------------------------------------------- Pattern lock securi

python实现基础的深度优先搜索(DFS, depth first search)解决数的全排列问题

数的全排列,是一个很简单的问题,平时我们用笔用纸就能列出答案,但是数列位多的时候,排列的结果就有非常多了,例如有1,2,3,4,5,6,7,8,9这一个数列,有9个数字,则有9!(9的阶乘)这么多种结果.那是非常大的.今天我就来介绍用深度优先搜索来解决这个数的全排列的问题. 深度优先搜索 首先简单介绍一下深度优先搜索,深度优先搜索的关键在于当下该如何做,至于下一步如何做,就与当下做的一样.深度优先搜索的基本模型为: dfs(step): 判断边界:执行相关操作,返回 尝试每一种可能 for( i

回溯法 求集合全排列、子集

全排列: 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个. 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列. 以对字符串abc进行全排列为例,我们可以这么做:以abc为例固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba固定c,求后面ba的排列:cba,cab. 这个思想和回溯法比较吻合. 代码可如下编

P1706 全排列问题

题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 3 输出样例#1: 1    2    3    1    3    2    2    1    3    2    3    1    3    1    2    3    2    1 代码如下: 1 #include<io

简单的dfs

dfs(Depth_First_Search): 它是一种图的遍历形式,其具体意义是从图中的某个顶点v出发,不停的遍历v的各个临界点,然后从各个临界点开始继续的向四周发散,直至遍历完所有与v路径相通的点,究其本质其实是应用了一种递归的思想: 模板代码为: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝 return ; for(扩展方式) { if(扩展方式

CodeForces 124B Permutations

http://codeforces.com/problemset/problem/124/B Description You are given nk-digit integers. You have to rearrange the digits in the integers so that the difference between the largest and the smallest number was minimum. Digits should be rearranged b

常见算法用Pascal实现

基本算法    这些都是非常基本的的算法,希望所有学习的人都能理解!        1.数论算法      求两数的最大公约数      function gcd(a,b:integer):integer;      begin      if b=0 then gcd:=a      else gcd:=gcd (b,a mod b);      end ;           求两数的最小公倍数      function lcm(a,b:integer):integer;      beg

HDU 1016 Prime Ring Problem(素数环问题)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 63806    Accepted Submission(s): 27457 Problem Description A ring is compos

(DFS、全排列)POJ-2718 Smallest Difference

题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n个数,必定为分成两个位数分别为n/2和n-n/2的数时才可能取得差的绝对值最小.两组数分别进行全排列比较大小,这样比较次数最大为(10A5)*(5A5)=10!,在可以接受的范围内. 参考代码: 1 #include<stdio.h> 2 #include<cstring> 3 #in