第二个点RE,但是用错误的点的数据,编译器能过,哪个大佬可以解释以下吗
查看原帖
第二个点RE,但是用错误的点的数据,编译器能过,哪个大佬可以解释以下吗
1293520
fzdkx楼主2024/3/27 19:31
/**
 * @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;
    }
}
2024/3/27 19:31
加载中...