搜索 递归 具体运行流程

**

一般初学者在看搜索的时候,很可能被递归给扰乱,不知道每个数都是怎么变化的,怎么算出来的,以下就是最简单的题的所有计算流程,手算不易求支持

**

**

题目描述

**
排列与组合是常用的数学方法。
先给一个正整数 ( 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

猜你喜欢

转载自blog.csdn.net/weixin_52559308/article/details/114779339