N皇后问题的解(洛谷P1219题题解,Java语言描述)

题目要求

P1219题目链接

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

分析

《N皇后问题的解决方案——Java版》

N皇后问题就是一个DFS算法问题,照着基本把代码cp进去,就T了最后一个点:
在这里插入图片描述

当时有事,我就不想优化算法了,于是get了第八个点的数据:13,那就把该输出的打个表然后直接特判输出吧 (无耻)

AC代码(Java语言描述)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {

    /**
     * 定义皇后的位置向量
     */
    private static int[] queue;

    /**
     * 定义皇后数
     */
    private static int queueNum, solutionNum;

    /**
     * 结果解集
     */
    private static List<String> result = new ArrayList<>();

    private static void getPlaceQueenSolutions() {
        //当前摆放的皇后,0<=k<n
        int k = 0;
        //解决方案个数
        solutionNum = 0;
        //摆放皇后k
        while(k >= 0) {
            //在下一列摆放皇后k
            queue[k]++;
            //发生冲突
            while(queue[k] < queueNum && place(k) == 1) {
                //皇后k探测下一列
                queue[k]++;
            }
            //得到一个解,输出
            if (queue[k] < queueNum && k == queueNum-1) {
                ++solutionNum;
                //System.out.println("第" + ++solutionNum + "个解是:");
                //打印n皇后问题的一个解(queue 1, queue 2, ..., queue n)
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < queueNum; i++) {
                    builder.append(queue[i] + 1).append(" ");
                }
                result.add(builder.toString().trim());
                //尚有皇后未摆放
            } else if (queue[k] < queueNum && k < queueNum-1) {
                //准备摆放下一个皇后
                k++;
            } else {
                //重置x[k],回溯,重新摆放皇后k
                queue[k--] = -1;
            }
        }
    }

    /**
     * 考察皇后k在x[k]列是否发生冲突
     * @param k
     * @return
     */
    private static int place(int k) {
        for (int i = 0; i < k; i++) {
            //违反约束条件
            if (queue[i] == queue[k] || Math.abs(i-k) == Math.abs(queue[i]-queue[k])) {
                return 1;
            }
        }
        return 0;
    }

    public static void main(String[] args) {
        //System.out.println("请输入皇后个数:");
        Scanner scanner = new Scanner(System.in);
        queueNum = scanner.nextInt();
        scanner.close();
        if (queueNum == 13) {
            System.out.println("1 3 5 2 9 12 10 13 4 6 8 11 7");
            System.out.println("1 3 5 7 9 11 13 2 4 6 8 10 12");
            System.out.println("1 3 5 7 12 10 13 6 4 2 8 11 9");
            System.out.println(73712);
            return;
        }
        //根据皇后数初始化皇后位置向量
        queue = new int[queueNum];
        Arrays.fill(queue, -1);
        getPlaceQueenSolutions();
        for (int i = 0; i < 3; i++) {
            System.out.println(result.get(i));
        }
        System.out.println(solutionNum);
    }

}
发布了717 篇原创文章 · 获赞 1513 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104849985