洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)相关的知识,希望对你有一定的参考价值。

八皇后 Checker Challenge

题目描述

在这里插入图片描述
输入格式

一行一个正整数 n,表示棋盘是 n×n 大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

输入输出

输入

6

输出

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

参考代码

注意:对角线right[i-j]后面必须加上一个n,因为i-j可能为负数,那么数组就会报错,所以将整体向右偏移n个单位(坐标偏移不会影响我们需要达到的目的),将所有可能变成正数;(因为i-j的最小值是-n+1,所以加上一个n就一定会变成一个正数)

本道题最重要的就是记录下皇后占领的格子(打标记的思想),通过此判断下一个皇后是否可以在某个位置,如果可以,则继续搜索下一个皇后可以在的位置,如果不行,则清除标记回到上一步,继续搜索;

需要注意:数组可以开大一点

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class n_皇后 {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static int n, res_sum;
    static int[] res = new int[14];  // 存储答案
    static int[] col = new int[14];  // 标记列占位
    static int[] right = new int[28];  // 标记右对角线:x-y差值不变
    static int[] left = new int[28];  // 标记左对角线:x+y相加相同

    public static void main(String[] args) {
        n = nextInt();
        res_sum = 0;
        dfs(1);
        System.out.println(res_sum);
    }
    public static void dfs(int r) {
        // 递归结束条件
        if (r == n+1) {
            // 输出前三个结果
            if (res_sum < 3) {
                for (int i = 1; i <= n; i++) {
                    System.out.print(res[i] + " ");
                }
                System.out.println();
            }
            res_sum++;
            return;
        }
        // 遍历每一列
        for (int c = 1; c <= n; c++) {
            // right[x-y+N]:+N是避免负数,报错
            if (col[c] == 0 && right[r-c+n] == 0 && left[r+c] == 0) {  // 判断有无皇后
                // 标记
                res[r] = c;  // 标记第r行第c列放一个皇后
                col[c] = 1;  // 占领c列
                // 占领双对角线
                right[r-c+n] = 1;
                left[r+c] = 1;
                // 往下一列搜索
                dfs(r+1);
                // 回溯,清楚标记
                col[c] = 0;
                right[r-c+n] = 0;
                left[r+c] = 0;
            }
        }
    }
    static int nextInt() {
        try {
            in.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int)in.nval;
    }
}

在这里插入图片描述
加油!

感谢!

努力!

以上是关于洛谷 P1219 [USACO1.5]八皇后 Checker Challenge(Java版)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1219 八皇后

洛谷 P1219 八皇后经典DFS,温习搜索

洛谷 P1219 八皇后

洛谷 P1219 八皇后 题解

P1219 八皇后

P1219 八皇后