给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
深度优先搜索的基础题目,一条路走到底,在进行单一路径逐步加深的时候,没加深一层就要加一层dfs,不断递归。
我的错误代码
#include<iostream>
using namespace std;
const int N = 10;
bool st[N];
int path[N];
int n;
void rdfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", path[i]);
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++)
{
if (!st[i])
{
path[u] = i;
st[i] = true;
rdfs(u++);
st[i] = false;
path[i] = 0;
}
}
}
int main()
{
cin >> n;
rdfs(0);
return 0;
}
这种错误“u++”很明显,首先++是后缀,相当于没有进行更深一步的搜索,即使用了++u也不行,因为为了走第二条路的分支,每一层里的u都是不能变得,不然回溯会出现问题.
同时,在进行清理的时候,path也不能用i,需要用u,不然清理的时候就会清理乱。
正确代码
#include<iostream>
using namespace std;
const int N = 10;
bool st[N];
int path[N];
int n;
void rdfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", path[i]);
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++)
{
if (!st[i])
{
path[u] = i;
st[i] = true;
rdfs(u+1);
st[i] = false;
path[u] = 0;
}
}
}
int main()
{
cin >> n;
rdfs(0);
return 0;
}
return code;