问题描述
给定一个整数 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);}