C语言 全排列

#include<stdio.h>
#include<stdlib.h>
#include<vector>

void swap(int *a,int *b)
{
	int tmp;
	tmp=*a;
	*a=*b;
	*b=tmp;
}

void permutation(int nums[],int i,int n)
{
	int j=0;
	if(i==n)
	{
		for(j=0;j<n;j++)
			printf("%d ",nums[j]);
		printf("\n");
	}
	else
	{
		for(j=i;j<n;j++)
		{
			swap(&nums[i],&nums[j]);
			permutation(nums,i+1,n);
			swap(&nums[i],&nums[j]);
		}
	}
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int i;
		int *nums=(int *)malloc(sizeof(int)*n);
		for(i=0;i<n;i++)
			scanf("%d",&nums[i]);
		permutation(nums,0,n);
	}
	return 0;
}

时间: 2024-08-04 01:54:30

C语言 全排列的相关文章

C语言实现全排列

实现全排列,递归实现 1 #include <stdio.h> 2 #include <stdlib.h> 3 int n=0; 4 5 void swap(int *a, int *b) 6 { 7 int m; 8 m=*a; 9 *a=*b; 10 *b=m; 11 } 12 void perm(int list[], int k, int m) 13 { 14 int i; 15 if(k==m) 16 { 17 for(i=0;i<=m;i++) 18 printf

分治法实现1-N的数字按字典序全排列组合 Java语言

package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 321 */ class GenerateP{ private int n; // 求 1-n所有数字的全排列 private final int maxn = 110;//最多可排列组合的长度 1-100 private boolean [] hashTable; private int []

1到9的全排列(用深搜 语言c++)

c++代码: #include<bits/stdc++.h>using namespace std;#define fo(i,a,b) for(int i=a;i<=b;i++)bool visit[11];int a[10];void dfs(int index){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//使c++输出和c一样快 if(index==10) {  cout<<a[1]<<a[2]&

字符串全排列和组合算法

打印字符串的全排列 算法的思路: 把一个字符串分成两部分,第一个字符+后面部分所有的字符.这样就能够递归的求解整个过程了: 1.每个字符都做一次首字符 2.当某个字符作为首字符的时候,求后面所有字符的全排列 而这里的求后面所有字符的全排列可以看成递归的子问题 全排列的递归树: 但是这里还有一个问题,那就是字符串中有重复的字符时,这样的算法会增加最后的结果数目.比如说字符串aab,a+ab的全排列,然后交换还是a+ab的全排列.所以会增加结果的数目.解决方案就是:当遇到重复的字符的时候就跳过去,不

算法学习(二) 全排列问题的非递归算法——模拟堆栈

前一段时间总结了全排列问题的几种递归解法,今天再总结一下如何通过对系统栈行为的模拟来非递归的实现全排列问题. 我们用一个数组stack[]来表示一个栈,用一个top指针来表示栈顶,用一个flags[]数组来标示每一个数字的可用性:用i来表示当前的状态. 初始状态top=0:i=-1:flags数组全为1: i递增,如果i没有越界并且flags[i]==1,那么就将i写入栈中,栈顶往前移动一位:最后把flags[i]赋值为0,i回溯到初始状态-1: 当栈顶越界,就将整个栈的信息打印出来,然后top

R语言︱ 数据库SQL-R连接与SQL语句执行(RODBC、sqldf包)

数据库是极其重要的R语言数据导入源数据之地,读入包有sqldf.RODBC等.跟SQL server相连有RODBC,跟mySQL链接的有RMySQL.但是在R里面,回传文本会出现截断的情况,这一情况可把我弄得有点手足无措. 一.数据库读入--RODBC包 CRAN 里面的包 RODBC 提供了 ODBC的访问接口: odbcConnect 或 odbcDriverConnect (在Windows图形化界面下,可以通过对话框选择数据库) 可以打开一个连接,返回一个用于随后数据库访问的控制(ha

c语言 深度优先 DFS

1 #include <stdio.h> 2 /* 3 输入一个数n,输出1~n的全排列,有多少种不同的排列? 4 //暴力枚举当然可以,写判断累死.for循环嵌套起来也是累. 5 6 这里运用的是depth first search,DFS 深度优先搜索的思想 7 装作n对应的是n张扑克牌,将其放入n个盒子里有多少种排列方法. 8 */ 9 int a[10],book[10],n;//c语言的全局变量在没有赋值以前默认为0;因此哲理的book数组无需全部再次赋初始值0; 11 void d

字典序法生成全排列算法的证明

引言 对一个给定数据进行全排列,在各种场合经常会用到.组合数学中,生成全排列的方法有很多,卢开澄老师的<组合数学>中就介绍了三种:序数法,字典序法,临位互换法等.其中以字典序法由于算法简单,并且使用的时候可以依照当前状态获取下一个状态,直到所有排列全部完成,方便在程序中随要随用,应用比较广泛,STL中的Next_permutation也是使用此法. 算法定义 首先看什么叫字典序,顾名思义就是按照字典的顺序(a-z, 1-9).以字典序为基础,我们可以得出任意两个数字串的大小.比如 "

C语言值基本算法43—总结

C程序的基本算法共涵盖42个例题,包含了枚举.排列.逻辑判断.迭代.递推.字符串操作.矩阵操作.格式输出等内容. 相关的实现方法有的显得很笨拙,但足够说明问题,而且每个程序都经过作者亲测,保证可以运行.之所以称之为基本算法,就是为了测试基础知识的掌握,都是从原始的角度进行处理,没有运用过于花哨的处理技巧,作者也是在学习中进步,也希望这些代码对于没有基础或者基础薄弱的朋友带来帮助. 至此,基本知识就掌握了,我们常常会听说C的强大,因为它是面向过程的,在数学领域具有极好的应用,有必要进行进一步的学习