代码设计思路
分析可知,外星人所给数据,就是1 - n的一个全排列的顺序,通过深度搜索,先搜索找到题目中所给的顺序,再按顺序向后搜索M次,即可找到所需结果,进行输出。
#include <iostream>
#include <cstdio>
#include <numeric>
#include <functional>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <queue>
#include <bitset>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e6 + 3;
const int N = 1e5 + 5;
int n;
int used[N], a[N];
void pt() {
for (int i = 1; i <= n; i++)
printf("%d ", a[i]);//%5d是占5个场宽
printf("\n");
}
int cnt,m;
int flag;//是否完成输出
void dfs(int depth) {
if (flag == 1) return;
if (depth > n) {
cnt++;
if (cnt > m) {
pt();
flag = 1;
return;
}
}
for (int i = 1; i <= n; ++i) {
if (cnt == 0) i = a[depth]; // 直接找到题目中给出的全排序列
if (!used[i]) {
used[i] = 1;
a[depth] = i;
dfs(depth + 1,r);
used[i] = 0;
}
}
return;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
dfs(1,q);
return 0;
}