**
一般初学者在看搜索的时候,很可能被递归给扰乱,不知道每个数都是怎么变化的,怎么算出来的,以下就是最简单的题的所有计算流程,手算不易求支持
**
**
题目描述
**
排列与组合是常用的数学方法。
先给一个正整数 ( 1 < = n < = 10 )
例如n=3,所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输入
输入一个整数n( 1<=n<=10)
输出
输出所有全排列
每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格)
**
最简单的搜索入门题,AC代码如下,随后就是运行流程,方便理解怎么递归的
**
#include<iostream>
using namespace std;
int n;
int vis[10];
int a[10];
void dfs(int index){
if(index == n){
//AAA
for(int i = 0; i < n ;i++) cout << a[i];
cout << endl;
return;
}
else{
for(int i =1; i <= n ;i++){
//BBB
if(!vis[i]){
//CCC 判断 vis 是不是0 是0 下一步
vis[i] = 1;
a[index] = i;
dfs(index + 1);
a[index] = 0;
vis[i] = 0;
}
}
}
}
void init(){
for(int i = 0; i<9 ;i++)
vis[i] = 0;
}
int main(){
while(cin >> n){
dfs(0);
init();
}
return 0;
}
以下为方法 vis ,递归的运行流程,把每一步的每一个数的结果,流程全部都写出来了。
具体运行如下
(cin << 3;) //以输入n为3作例
index = 0 != n //对应AC代码注释的AAA
else for i = 1 //对应AC代码注释的BBB
if == 0 //对应AC代码注释的CCC
vis[1] = 1 //记下来是否用过的记录
a[0] = 1 //记下来运算答案
dfs(1) >>> index = 1 //开始递归
for i = 1 //对应AC代码注释的BBB
if != 0 //对应AC代码注释的CCC
for i = 2
if == 0
vis[2] =1
a[1] =2
dfs(2) >>> index =2
for i = 1
if != 0
for i = 2
if != 0
for i = 3
if == 0
vis[3] =1
a[2] =3
dfs(3) >>> index = 3 = n //对应AC代码注释的AAA
cout << a{
} //1 2 3
return
vis[3] =0
a[2] =0 //去掉标记
vis[2] =0
a[1] =0
for i = 3 //对应AC代码注释的BBB
if == 0 //对应AC代码注释的CCC
vis[3] =1
a[1] =3
dfs(2) >>> index =2
for i = 1
if != 0
for i = 2
vis[2] =1
a[2] =2
dfs(3) >>> index = 3 = n
cout << a{
} //1 3 2
return
vis[2] =0
a[2] =0
for i = 3
if != 0
vis[3] =0
a[1] =0
for i = 2 //对应AC代码注释的BBB
if == 0 //对应AC代码注释的CCC
vis[2] =1
a[0] =2
(vis[i] = 1 , a[index] = i , dfs(index)) //把变量的运算再写过来,不用再看AC代码了
dfs(1) >>> index = 1
for i = 1
if == 0
vis[1] =1
a[1] =1
dfs(2) >>> index =2
for i = 1
if != 0
for i = 2
if != 0
for i = 3
vis[3] =1
a[2] =3
dfs(3) >>> index = 3 = n
cout << a{
} //2 1 3
return
vis[3] =0
a[2] =0
for i = 2
if != 0
for i = 3
if == 0
vis[3] =1
a[1] =3
dfs(2) >>> index =2
for i = 1
if == 0
vis[1] =1
a[2] =1
dfs(3) >>> index = 3 = n
cout << a{
} //2 3 1
return
vis[1] =0
a[2] =0
for i = 2
if != 0
for i = 3
if != 0
vis[3] =0
a[1] =0
for i = 3
if == 0
vis[3] =1
a[0] =3
(vis[i] = 1 , a[index] = i , dfs(index))
dfs(1) >>> index = 1
for i = 1
if == 0
vis[1] =1
a[1] =1
dfs(2) >>> index =2
for i = 1
if != 0
for i = 2
if == 0
vis[2] =1
a[2] =2
dfs(3) >>> index = 3 = n
cout << a{
} //3 1 2
return
vis[2] =0
a[2] =0
for i = 3
if != 0
for i = 2
if == 0
vis[2] =1
a[1] =2
dfs(2) >>> index =2
for i = 1
if == 0
vis[1] =1
a[2] =1
dfs(3) >>> index = 3 = n
cout << a{
} //3 2 1
return
vis[1] =0
a[2] =0
for i = 2
if != 0
for i = 3
if != 0
vis[3] =0
a[1] =0
for i = 3
if != 0