#include<iostream>
using namespace std;
const int N = 10;
int path[N];//path[i]记录第i个位置放什么数
bool st[N];//st[i]记录数字i是否被使用过
int n;
void dfs(int u){//u代表第u个位置
if(u == n){//如果已经放到最后一位,就输出
for(int i = 0; i < n; i ++ ){//path数组从第0位开始存,所以从第0位开始输出
cout<<path[i]<<" ";
}
cout<<endl;
return ;//每种情况输出完成之后返回递归的上一层
}
//如果所有位置还没全部填满
for(int i = 1; i <= n; i ++ ){//从1开始枚举要填入path的数
if(!st[i]){//如果i没有被用过
path[u] = i;//第u个位置就填上i
st[i] = true;//标记一下i已经被用过,进行下一层递归的时候i就不能再被用
dfs(u + 1);//进行下一层递归,填下一个位置的数
st[i] = false;//从下一层递归返回后,就撤销对i的标记,避免妨碍枚举下一种情况
}
}
}
int main()
{
cin>>n;
dfs(0);//从第一个位置开始
return 0;
}
AcWing 842 排列数字 题解 (DFS)
最新推荐文章于 2024-11-05 17:16:24 发布