DFS代码模板
问题:
给定一个整数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
比较直观的模板代码:
a数组存放结果
f数组标记是否被访问过
dfs(i) 表示的含义是:在 a[i] 处填写数字,然后递归到下一个位置填写数字。
回溯:第 i 个位置填写某个数字的所有情况都遍历后, 第 i 个位置填写下一个数字。
#include<iostream>
#include<cstring>
#define N 10
using namespace std;
int n;
int a[N];
bool f[N];
void dfs(int u)
{
if(u == n){
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(f[i] == false){
a[u] = i;
f[i] = true;
dfs(u+1);
f[i] = false;
a[u] = 0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
题目描述
打印n个数中的m个数的全排列
样例输入
5 2
样例输出
1 2
1 3
1 4
1 5
2 1
2 3
2 4
2 5
3 1
3 2
3 4
3 5
4 1
4 2
4 3
4 5
5 1
5 2
5 3
5 4
#include<iostream>
#include<cstring>
#define N 10
using namespace std;
int n,m;
int a[N];
bool f[N];
void dfs(int u)
{
if(u == m){
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(f[i] == false){
a[u] = i;
f[i] = true;
dfs(u+1);
f[i] = false;
a[u] = 0;
}
}
}
int main()
{
cin>>n>>m;
dfs(0);
return 0;
}