【Java每日一题,dfs】[USACO1.5]八皇后 Checker Challenge

简介: 【Java每日一题,dfs】[USACO1.5]八皇后 Checker Challenge

Introduction

一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。


上面的布局可以用序列 2\ 4\ 6\ 1\ 3\ 52 4 6 1 3 5 来描述,第 ii 个数字表示在第 ii 行的相应位置有一个棋子,如下:


行号 1\ 2\ 3\ 4\ 5\ 6 1 2 3 4 5 6


列号 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5


这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。

并把它们以上面的序列方法输出,解按字典顺序排列。

请输出前 33 个解。最后一行是解的总个数。


Input

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


Output

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


Sample

input

6

output

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

Solution

import java.util.Scanner;
public class Main{
    static int[] left;
    static int[] right;
    static int[] cols;
    static int[] rows;
    static int n;
    static int count=0;
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        n=s.nextInt();
        rows=new int[n+1];
        cols=new int[n+1];
        left=new int[2*n-1];
        right=new int[2*n-1];
        dfs(1);
        System.out.print(count);
    }
    static void dfs(int row){
        if(row==n+1){
            if(count<=2){
                System.out.print(rows[1]);
                for (int i=2;i<=n;i++){
                    System.out.print(" "+rows[i]);
                }
                System.out.println();
            }
            count++;
            return;
        }
        for(int i=1;i<=n;i++){
            if(cols[i]!=0||right[row+i-2]!=0||left[row-i+n-1]!=0){
                continue;
            }
            rows[row]=i;
            cols[i]=1;
            right[row+i-2]=1;
            left[row-i+n-1]=1;
            dfs(row+1);
            cols[i]=0;
            right[row+i-2]=0;
            left[row-i+n-1]=0;
        }
    }
}

Experience

第一次做很难的啦,没想到dfs里面能用循环

相关文章
【Java每日一题,dfs】矩阵查找字符串
【Java每日一题,dfs】矩阵查找字符串
|
机器学习/深度学习 Java
【Java每日一题,dfs】Find The Multiple
【Java每日一题,dfs】Find The Multiple
|
机器学习/深度学习 Java
【Java每日一题,dfs】洛谷P1162 填涂颜色
【Java每日一题,dfs】洛谷P1162 填涂颜色
|
机器学习/深度学习 Java
【Java每日一题,深度搜索dfs】棋盘问题
【Java每日一题,深度搜索dfs】棋盘问题
|
6月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
48 4
|
6月前
|
Java
01背包介绍与N皇后(dfs,考验代码能力JAVA)
01背包介绍与N皇后(dfs,考验代码能力JAVA)
|
6月前
|
算法 Java
Java数据结构与算法:图算法之深度优先搜索(DFS)
Java数据结构与算法:图算法之深度优先搜索(DFS)
【Java每日一题,dfs】挖出最大财宝
【Java每日一题,dfs】挖出最大财宝
|
7月前
|
数据采集 算法 Java
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
72 0
【Java每日一题,dfs】哈密顿绕行世界问题
【Java每日一题,dfs】哈密顿绕行世界问题