洛谷-P1219 八皇后(java,DFS,100)

在这里插入图片描述

在这里插入图片描述

思路代码:


import java.util.Scanner;

public class Main {
    
    
    //定义一个max表示一共有多少个皇后。
    Scanner input = new Scanner(System.in);
    int max = input.nextInt();
    // 定义一个数组就可以了,下标为第i个皇后,即第i行。值为对应的第几列。
    int[] array = new int[max];
    // 统计一共有多少种方法,打印一次即count++
    static int count = 0;

    public static void main(String[] args) {
    
    
        Main queen8 = new Main();
        queen8.check(0);
        System.out.println(count);
    }


    public void check(int n) {
    
    
        //n从0开始,当n==max的时候,说明所有皇后的位置摆放好了。
        if (n == max) {
    
    
            count++;
            if (count<4){
    
    
                printf();
            }
            return;
        }

        for (int i = 0; i < max; i++) {
    
    
            array[n] = i;
            //判断第n个皇后的摆放位置是否满足要求,如果满足则递归下去摆放下一个皇后。
            //!!这样打印的不止是一种摆放,
            //当最后一个位置摆放可以的时候,就打印,然后接着未结束的for循环。
            // 然后返回到上一层,接着上一层未结束的for循环。单纯判断是否冲突就得1.5万多次了。
            if (judge(n)) {
    
    
                check(n + 1);
            }
        }
    }

    //判断放的位置是否满足,即不同列、不同斜线上。
    //不需要考虑同一行的情况,因为我们下标 i 就代表了行。
    public boolean judge(int n) {
    
    
        for (int i = 0; i < n; i++) {
    
    
            // 同一斜线上,即正方形的对角线,也可理解为斜率为+-1;即 a行-b行==a列-b列 (绝对值)
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
    
    
                return false;
            }
        }
        return true;
    }

    //打印
    public void printf() {
    
    
        for (int i = 0; i < max; i++) {
    
    
            System.out.print(array[i] + 1 + " ");
        }
        System.out.println();
    }
}

在这里插入图片描述
在这里插入图片描述

如果复制代码过去发现最后一个样例超时的时候,多提交几次就好了,哈哈哈哈。(有疑问或更好的思路,欢迎评论区探讨)。

原题链接:https://www.luogu.com.cn/problem/P1219

猜你喜欢

转载自blog.csdn.net/weixin_46157208/article/details/108126623