深搜-----1~n的全排列
Posted xrisa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深搜-----1~n的全排列相关的知识,希望对你有一定的参考价值。
时隔“多年”,再来解决这个历史遗留的问题----深搜
题目描述
输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
输出格式
由 1 ~ n 组成的所有不重复的数字序列,两数间空一格,每行一个序列。
总方案数
输入输出样例
输入 #1
3
输出 #1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
6
思路很简单,深搜嘛,直接(拿样例来举例:)看代码吧!
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #define maxn 10005 7 //#define ISA_XR 8 using namespace std; 9 int n,book[maxn],a[maxn],s; //n-求1~n的全排列 a记录当前序列 book[i]记录 i 是否在序列中 s总排列方式个数 10 void dfs(int step); // step为当前在序列中的位置,即已放个数 + 1 11 int main() 12 { 13 #ifdef ISA_XR 14 freopen(".in","r",stdin); 15 freopen(".out","w",stdout); 16 #endif 17 18 scanf("%d",&n); 19 dfs(1); //深搜 20 printf("%d",s); // 共有 n!种排列方式 21 22 #ifdef ISA_XR 23 fclose(stdin); 24 fclose(stdout); 25 #endif 26 27 return 0; 28 } 29 30 void dfs(int step) 31 { 32 if(step == n + 1) //所有数已放完,即已形成 1 种排列 33 { 34 for(int i = 1;i <= n;i++) 35 { 36 printf("%d ",a[i]); // 输出其中一种排列 37 } 38 printf(" "); 39 s++; //排列种数 + 1 40 return; //回到上一次尝试 41 } 42 for(int i = 1;i <= n;i++) 43 { 44 if(book[i] == 0) // 这个数没放在序列中 45 { 46 a[step] = i,book[i] = 1; //尝试一个数将其放入序列中,已用标记book为 1 47 dfs(step + 1); // 下一层“下一个盒子 ”(注意 x++ 与 x + 1 与 ++x 的加一先后顺序 ) 48 book[i] = 0; // 刚尝试过的数要放回 49 } 50 } 51 return; //回溯(回到上一次尝试) 52 }
好像把思路打出来更容易理解,但我太懒了,下次想起来了在打吧。。。。咕咕咕咕
以上是关于深搜-----1~n的全排列的主要内容,如果未能解决你的问题,请参考以下文章