问题描述
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
问题求解
搜素方法:DFS(一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止)
搜索过程如下图所示:
path数组:记录每一位的数值
state数组:记录每个数字的使用状态(初始为0,表示未被使用)
搜索过程:
从第1层(u=1) 开始搜索:
可以使用的数字:1——3循环
若 state[1] = 0 即表示没有使用过:
把数字1放到第一层的位置上 path[u]=i
把state[1]=1 表示关闭数字1的使用权
dfs(u+1) 进入下一层搜索:
此时u=2:
数字i从1——3循环:
state[1]=1 不能用
state[2]=0 可用
把数字2放到第2层的位置上 path[u]=i
把state[2]=1 表示关闭数字2的使用权
dfs(u+1) 进入下一层搜索:
此时 u =3:
数字i循环:
i=1,2不可用
state[3] =0可用
把数字3放到第3层
把state[3]=1 表示关闭数字3的使用权
dfs(u+1) 进入下一层搜索:
输出path数组
代码实现
#include <iostream>
using namespace std;
int path[10];
bool state[10];
int n;
void dfs(int u){
if(u>n){
for(int i = 1; i<=n ; i++){
cout<<path[i]<<" ";
}
cout<<endl;
return;
}
for(int i =1; i<=n; i++){
if(!state[i]){
path[u] = i;
state[i] = true;
dfs(u+1);
state[i] = false;
}
}
return;
}
int main(){
cin>>n;
dfs(1);
}