ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022.02.22 - 248.八皇后

2022-02-22 16:01:05  阅读:117  来源: 互联网

标签:index 248 22 int list 2022.02 add new public


文章目录

1. 题目

在这里插入图片描述

2. 思路

(1) 回溯法

  • 利用回溯法确定每一行中皇后的位置,由于回溯法遍历的是行,因此,可以不用记录行号,只记录列号、正对角线、反对角线即可。
  • 关键在于如何唯一地表示某一对角线,行号-列号可以唯一地表示正对角线,行号+列号可以唯一地表示反对角线。

3. 代码

import java.util.*;

public class Test {
    public static void main(String[] args) {
    }
}

class Solution {
    public int n;
    public List<List<String>> res;
    public List<Integer> list;
    public Set<Integer> col;
    public Set<Integer> l1;
    public Set<Integer> l2;


    public List<List<String>> solveNQueens(int n) {
        this.n = n;
        res = new ArrayList<>();
        list = new ArrayList<>();
        col = new HashSet<>();
        l1 = new HashSet<>();
        l2 = new HashSet<>();
        backtrack(0);
        return res;
    }

    public void backtrack(int index) {
        if (index == n) {
            if (list.size() == n) {
                add();
            }
            return;
        }
        for (int i = 0; i < n; i++) {
            int ll1 = index - i;
            int ll2 = index + i;
            if (!col.contains(i) && !l1.contains(ll1) && !l2.contains(ll2)) {
                col.add(i);
                l1.add(ll1);
                l2.add(ll2);
                list.add(i);
                backtrack(index + 1);
                col.remove(i);
                l1.remove(ll1);
                l2.remove(ll2);
                list.remove(list.size() - 1);
            }
        }
    }

    public void add() {
        List<String> temp = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            char[] chars = new char[n];
            Arrays.fill(chars, '.');
            chars[list.get(i)] = 'Q';
            temp.add(String.valueOf(chars));
        }
        res.add(temp);
    }
}

标签:index,248,22,int,list,2022.02,add,new,public
来源: https://blog.csdn.net/qq_44021223/article/details/123070241

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有