【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里面能用循环

相关文章
|
7月前
|
Java
【Java每日一题,dfs】矩阵查找字符串
【Java每日一题,dfs】矩阵查找字符串
|
7月前
|
机器学习/深度学习 Java
【Java每日一题,dfs】Find The Multiple
【Java每日一题,dfs】Find The Multiple
|
7月前
|
机器学习/深度学习 Java
【Java每日一题,dfs】洛谷P1162 填涂颜色
【Java每日一题,dfs】洛谷P1162 填涂颜色
|
7月前
|
机器学习/深度学习 Java
【Java每日一题,深度搜索dfs】棋盘问题
【Java每日一题,深度搜索dfs】棋盘问题
|
2月前
|
数据采集 算法 Java
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
DFS(深度搜索)无向图遍历(JAVA手把手深入解析)
41 0
|
7月前
|
Java
【Java每日一题,dfs】挖出最大财宝
【Java每日一题,dfs】挖出最大财宝
|
7月前
|
Java
【Java每日一题,dfs】哈密顿绕行世界问题
【Java每日一题,dfs】哈密顿绕行世界问题
|
10月前
|
Java
数据结构(11)图的遍历,DFS、BFS的JAVA实现
11.1.图的遍历 图的遍历,即将图内所有顶点都访问一遍。 有两种遍历方式: BFS DFS 以下图的遍历为例:
58 0
|
人工智能 Java BI
力扣207:课程表(Java拓扑排序:bfs+dfs)
力扣207:课程表(Java拓扑排序:bfs+dfs)
102 0
力扣200:岛屿数量(Java dfs+bfs)
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。