题目描述
排列与组合是常用的数学方法。
先给一个正整数 ( 1 < = n < = 10 )
例如n=3,所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输入
输入一个整数n( 1<=n<=10)
输出
输出所有全排列
每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格)
样例输入 复制
3
样例输出 复制
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
分析:
根据DFS的思想,“岔路口”是每次选择加入排列的元素,“死胡同”是已排列的数量。每次选择一个未加入排列的元素加入排列,并在当数量达到上限时输出。
要点:
每次递归进DFS时,把要加入的元素标记,表示该元素以加入,但要记得在退出递归时取消该元素的标记,恢复原样,不然之后该元素就一直处于被加入的状态。
#include <iostream>
#include <vector>
using namespace std;
int n;
void DFS(vector<bool> N,vector<int> S,int index){
if(index == n){
for(auto it = S.begin(); it != S.end(); it++){
cout << *it;
if(it + 1 == S.end()){
cout << '\n';
}else{
cout << ' ';
}
}
}
for(int i = 1; i <= n; i++){
if(N[i] == false){
N[i] = true;
S.push_back(i);
DFS(N, S, index + 1);
S.pop_back();
N[i] = false;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin >> n){
vector<bool> N;
vector<int> S;
for(int i = 0; i <= n; i++){
N.push_back(false);
}
DFS(N, S, 0);
}
return 0;
}