全排列

全排列

Description

从 n 个不同元素中任取 m(m ≤ n) 个元素,按照一定的顺序排列起来,叫做从 n 个不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。今天这道题目很简单就是给你一个整数 n ,计算 [1,n] 所有数字的排列组合。

Input

第一行输入一个整数 n ( 1 ≤ n ≤ 10).

Output

第一行输出一个全排列的方案总数 m。接下来按照字典序依次输出这 m 个排列。排列的字典的比较方法和字符串一样,比如两个排列 a,b,从第一个数开始,找到第一个不同的数的位置为 i,然后比较 a[i] 和 b[i] 的大小,如果 a[i] 小的,那么 a 的字典序就小,否则 b 的字典序更小。

Sample Input 1

2
Sample Output 1

2
12
21
Sample Input 2

3
Sample Output 2

6
123
132
213
231
312
321
——摘自YCOJ
看到这道题,你想到了什么?
一道DFS的实现。简单的说,用DFS搜索出n的全部排列组合,统计方案数,就是这道题的答案。
一起提到过DFS的基本思想。深度优先搜索按照深度优先的方式进行搜索,注意,这里的“搜索”不是指的我们平时在文件中或者在网络上查找某些信息,搜索是一种穷举的方式,把所有可行的方案都列出来,不断去尝试,直到找到问题的答案。
在我的理解中,搜索被分为两大类,一种是在图上进行的搜索,例如踏青还有一种是,不在图上的搜索,例如组合+判断素数N皇后等。而全排列是典型的第二种。
这道题,我们只需不断的搜出方案数统计并累计输出,就可以了。

#include<bits/stdc++.h>
using namespace std;

int a[1010],v[1010];
int n,m=0;
int b[1000000][100];
	
	void dfs(int k){
		if(k  == n+1){			
			m++;
			
			for(int i=1;i<=n;i++){
				b[m][i] = a[i];
			}
		}else{
		    for(int i=1;i<=n;i++)
		    	if(v[i] == 1){
		    		v[i] = 0;
                    a[k] = i;
				     dfs(k+1);
					 a[k] = 0;
					v[i] = 1;
							    		
				}
			}
		}
			 
int main(){

       cin >> n;
        for(int i=1;i<=n;i++){
        	v[i] = 1;
		}
	    dfs(1);
	    cout << m << endl;
         for(int i = 1;i<=m;i++){
         	for(int j=1;j<=n;j++){
         		cout << b[i][j];
         		 
			 }
			 cout << endl;
		 }
		 
		
	return 0;
}

——END——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值