//BFS是指深度优先搜索,它从某个节点开始一直寻找到这个点的叶子节点,之后才会回溯到这个叶子节点的上一个父节点,再从这个父节点开始搜索。
Acwing842. 排列数字
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 nn。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<iostream>
using namespace std;
const int N=10;
int n;
/*
* 对于一颗树而言,BFS会从一个节点一轮寻找到叶子节点,我们称这条路径为一个解向量
*/
int path[N];//存储这个解向量
bool str[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++){//要注意这里的i和上面i的区别,上面的i只是单纯的循环变量,遍历输出整个整个解向量;这里的i和循环配合str[]用于查找我们是否可以选这个数字
if(!str[i]){
path[u]=i;
str[i]=true;
//如果没有被选过,则选定该数字,再进行一次dfs
dfs(u+1);
//这里也是BFS以及回溯中最重要的部分了,为什么要让这个数字再次“不被选中”?
//我们可以想象 比如说n=3的时候 我们选完了第一个数字为1的情况,就要“移除”这种情况,选择其他的节点
//这里要配合递归是一个栈以及循环来思考
str[i]=false;
}
}
}
int main(){
scanf("%d",&n);
dfs(0);
return 0;
}