题目描述:
给定一个整数 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
——————————————————————————
算法:BFS(广度优先搜索)
#include <iostream>
#include <queue>
#include <vector>
#define ints vector<int>
#define bools vector<bool>
using namespace std;
int n;
queue<pair<ints, bools>> q; // 广搜到的那个节点的数据结构,ints代表已选择的序列, bools说明数字是否使用
int main()
{
scanf("%d", &n);
q.push({{}, bools (n + 1, false)}); // 初始化
while(q.size())
{
ints cur_seq = q.front().first;
bools cur_use = q.front().second;
q.pop();
for(int i = 1; i <= n; i ++)
{
if (!cur_use[i])
{
ints new_seq = cur_seq;
new_seq.push_back(i);
if (new_seq.size() == n) // 如果序列长度达到n则说明搜索到一个完整结果,输出,否则连带新的bools加入搜索队列
{
for(int i = 0; i < n; i++)
printf("%d ", new_seq[i]);
puts("");
continue;
}
bools new_use = cur_use;
new_use[i] = true;
q.push({new_seq, new_use});
}
}
}
return 0;
}