/**
* @author 发着呆看星
* @create 2024/3/27
*/
public class Code_07_火星人 {
static int n;
static int m;
static int[] nums;
// flag[i]:i数字是否已被使用
static boolean[] flag;
// find[i]:nums数组中第i个下标处,是否将nums[i]之后的数据全部尝试了一遍
// 如果尝试了一遍,标记为true,从1重新开始
// 如果没有,那么从nums[i]开始
static boolean[] find;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(br);
in.nextToken();
n = (int) in.nval;
in.nextToken();
m = (int) in.nval;
// nums = new int[n]; --> RE 运行时异常,但是我的编译器用 给的错误点数据 能过
nums = new int[n + 1]; // 洛谷能过
for (int i = 0; i < n; i++) {
in.nextToken();
nums[i] = (int) in.nval;
}
// flag = new boolean[n]; --> RE 运行时异常,但是我的编译器用 给的错误点数据 能过
flag = new boolean[n + 1]; // 洛谷能过
find = new boolean[n + 1];
// 深度优先搜索,从原有排序开始搜索
dfs(0);
// 输出最后的nums
for (int i = 0; i < n - 1; i++) {
System.out.print(nums[i] + " ");
}
System.out.println(nums[n - 1]);
}
/**
* @param index 当前所在层数,或者说,当前正在填nums中的哪个下标
*/
private static void dfs(int index) {
// 下标已经越界了 或者 m已经减为0了
if (index == n || m == -1) {
if (m != -1) {
--m;
}
return;
}
// 未越界 且 m > 0
for (int value = find[index] ? 1 : nums[index]; value <= n; value++) {
// 判断当前数是否被使用
if (!flag[value]) {
// 未被使用
// 标记为正在使用
flag[value] = true;
// nums[index]位置改成value
nums[index] = value;
// 进行下一层递归
dfs(index + 1);
// 如果经过一次dfs后,m==0,那么就代表找到了,应该结束递归
if (m == -1) {
return;
}
// 解除当前数的标记
flag[value] = false;
}
}
// 当前位置从 nums[i] ~~ n,全部尝试了一遍,标记为true,下次从1开始
find[index] = true;
}
}