洛谷 P1219 [USACO1.5]八皇后 Checker Challenge

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

题目:
在这里插入图片描述
在这里插入图片描述

思路:
八皇后问题,典型dfs,dfs练习。

代码:
不是很熟练,代码有些冗余

import java.util.ArrayList;
import java.util.Scanner;

public class P1219_八皇后CheckerChallenge {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        boolean[] use = new boolean[n];//是否使用状态数组

        //遍历第一行的数
        for (int i = 1; i <= n; i++) {
            ArrayList<Integer> list = new ArrayList<>();//建立结果数组
            list.add(i);//第一行放置位置
            use[i - 1] = true;//使用过置为true
            dfs(n, list, use);
            list.remove(list.size() - 1);//回溯
            use[i - 1] = false;//回溯
        }


        //输出结果
        for (int i = 0; i < 3; i++) {
            StringBuilder stringBuilder = new StringBuilder();
            ArrayList<Integer> list = reslists.get(i);
            for (Integer integer : list) {
                stringBuilder.append(integer + " ");
            }
            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            System.out.println(stringBuilder.toString());
        }
        System.out.println(reslists.size());
    }

    private static ArrayList<ArrayList<Integer>> reslists = new ArrayList<>();//结果集合

    /*
     *
     * @param n 棋盘边长
     * @param list 结果数组
     * @param use 是否使用数组
     * @author DaiLong
     * @date 2022/4/24 10:40
     * @return void
     */
    private static void dfs(int n, ArrayList<Integer> list, boolean[] use) {
        if (list.size() == n) {
            reslists.add(new ArrayList<>(list));
            return;
        }

        for (int i = 1; i <= n; i++) {
            if (!use[i - 1] && po(i, list)) {//代表这个节点没有使用  并且判断这个节点位置合理
                use[i - 1] = true;
                list.add(i);
                dfs(n, list, use);
                use[i - 1] = false;
                list.remove(list.size() - 1);
            }
        }
    }


    //判断放置棋子是否符合站位
    //两点之间斜率不能为1或-1
    private static boolean po(int n, ArrayList<Integer> list) {
        int m = list.size() + 1;
        for (int i1 = 0; i1 < list.size(); i1++) {

            int n1 = i1 + 1 - m;
            int m1 = list.get(i1) - n;

            if (n1 == 0 || m1 == 0 || n1 == m1 || n1 == -m1) {
                return false;
            }
        }
        return true;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值