DFS即深度优先搜索

适用于将一个问题的所有方面全部展开

 

acwing842即这么一个问题 : 问题传送门:https://www.acwing.com/activity/content/problem/content/905/1/

主要是记录下没有基本模板的dfs需要注意的基本问题,也是使用dfs时的基本特点

 

本题是一个全排列问题:

将从1-n的n个数字的所有排列情况全部输出即可

 

以样例为例。

1-3共有3个位置

3个位置可以上3个数中的一个,若1号位置为1,则2号3号位置不能为1,只能为2或3;若2号位置为2,3号位置不能为1和2,只能为3.此时得到一组排列

以此类推我们可以得到共6种全排列。

 

关于DFS实现的问题:
需要注意

1.当一次搜索结束时,输出所有情况并回溯返回上一层

2.当返回上一层后,必须回复现场,即将标记过已被占用的位置恢复成未被占用

 

代码详解:
 

/*
dfs重点是顺序 
破坏完现场后再恢复现场 
*/
#include<iostream>

using namespace std;

const int N = 8;
int path[N]; //全排列数组,其中记录一次排列 
bool st[N];  //记录当前位置是否被占用了 

void dfs(int u){//u号位置搜索 
	if(u == n){
		for(int i = 0; i < n; i++)
			cout << path[i] << ' ';
		cout << endl;
		return;
	}
	
	for(int i = 1; i <= n; i++)
		if(!st[i]){//该位置没被占用,则此时可占用 
			 path[u] = i; //给u号位上添数字
			 st[i] = true; //占用过了就记录下
			 dfs(u+1); //u号位置搜索过后,开始u+1号位的搜索
			 //搜索结束后恢复现场
			 st[i] = false;
			 path[u] = 0;
			 //这里也可不用恢复path[u]因为 path[u]再循环中会被直接赋值 
		}
}
int main()
{
	int n;
	cin >> n;
	
	dfs(0);
	
	return 0;
}