首页 > 其他分享 >[LeetCode] 51. N-Queens

[LeetCode] 51. N-Queens

时间:2023-05-30 13:36:37浏览次数:49  
标签:return int 51 col board sb Queens LeetCode row

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle. You may return the answer in any order.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space, respectively.

Example 1:

Input: n = 4
Output: [[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above

Example 2:

Input: n = 1
Output: [["Q"]]

Constraints:

  • 1 <= n <= 9

N 皇后。

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路是 DFS 回溯。这是一道经典的回溯题,建议先尝试回溯类型的其他题目再尝试这道题目。我参考了这个帖子

对于一个边长为 n 的棋盘,我们需要去找出所有方案,看看 N 个皇后可以怎么摆。基本思路是先创建一个边长为 n 的棋盘,用点表示没有棋子的位置,然后每放置一个皇后就去判断当前棋盘是否合法,如此试探出所有可行解。

时间O(N * N!) - 放置皇后有 N! 种方式 * 每放置一个棋子就要检查整个棋盘(N 行)是否合法

空间O(N * N)

Java实现

 1 class Solution {
 2     List<List<String>> res = new ArrayList<>();
 3     
 4     public List<List<String>> solveNQueens(int n) {
 5         List<String> board = new ArrayList<>();
 6         for (int i = 0; i < n; i++) {
 7             StringBuilder sb = new StringBuilder();
 8             for (int j = 0; j < n; j++) {
 9                 sb.append('.');
10             }
11             board.add(sb.toString());
12         }
13         helper(board, 0);
14         return res;
15     }
16     
17     private void helper(List<String> board, int row) {
18         if (row == board.size()) {
19             res.add(new ArrayList<>(board));
20             return;
21         }
22         
23         int n = board.get(row).length();
24         for (int col = 0; col < n; col++) {
25             if (!isValid(board, row, col)) {
26                 continue;
27             }
28             StringBuilder sb = new StringBuilder(board.get(row));
29             sb.setCharAt(col, 'Q');
30             board.set(row, sb.toString());
31             // 进入下一行决策
32             helper(board, row + 1);
33             // 撤销选择
34             sb.setCharAt(col, '.');
35             board.set(row, sb.toString());
36         }
37     }
38     
39     private boolean isValid(List<String> board, int row, int col) {
40         int n = board.size();
41         // 检查列是否有皇后互相冲突
42         for (int i = 0; i < n; i++) {
43             if (board.get(i).charAt(col) == 'Q') {
44                 return false;
45             }
46         }
47         
48         // 检查右上方是否有皇后互相冲突
49         for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
50             if (board.get(i).charAt(j) == 'Q') {
51                 return false;
52             }
53         }
54         
55         // 检查左上方是否有皇后互相冲突
56         for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
57             if (board.get(i).charAt(j) == 'Q') {
58                 return false;
59             }
60         }
61         return true;
62     }
63 }

 

LeetCode 题目总结

标签:return,int,51,col,board,sb,Queens,LeetCode,row
From: https://www.cnblogs.com/cnoodle/p/17442958.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:填充每个节点的下一个右侧节点指针 II
    题目:给定一个二叉树:structNode{ intval; Node*left; Node*right; Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NULL。初始状态下,所有 next指针都被设置为NULL。 示例1:输入:root=[1,2,3......
  • 算法学习day30回溯part06-332、51、37
    packageLeetCode.backtrackpart06;importjava.util.ArrayList;importjava.util.Collections;importjava.util.LinkedList;importjava.util.List;/***332.重新安排行程*给你一份航线列表tickets,其中tickets[i]=[fromi,toi]表示飞机出发和降落的机场地点......
  • hdu 1516(编辑距离+记录路径)
    最开始把问题搞错了,以为是两个串都可以做修改,无论我怎么想都不通。回到这个题目上,这道题和最长公共子序列很相似,思路可以说是一样的,包括记录路径。其实也就是根据递推数组的结果来判断。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintma......
  • poj 1451(Trie)
    题意:就是让你模拟手机输入单词。具体就是给你一些单词,以及该单词被使用的频数,这个频数也是该单词前缀的使用频数,当然不同的单词有可能有相同的前缀,那么这个相同的前缀的使用频数就是这两个单词使用频数之和,以此类推。然后再给你一些数字串,让你针对该数字串的每一个前缀输出它的最有......
  • hdu 1510
    WhiteRectanglesTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)ProblemDescriptionYouaregivenachessboardmadeupofNsquaresbyNsquareswithequalsize.Someofthesquaresarecoloredblack,andthe......
  • 用自然语言让AI打leetcode周赛
    还在自己吭哧吭哧打算法平台Leetcode的周赛?为什么不试试神奇的ChatGPT类AI呢!用AI助手Claude参加第103场周赛,共四道题,均完成了AC,能达到参与者前10%的成绩。事情的起因是知乎上一位叫萧雅的用户尝试使用AI进行编程,但在测试过程中,她发现直接给出题目让AI进行编程并输出结果的方法,效......
  • 518.零钱兑换II
    给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合32位带符号整数。输入:amount=5,coins=[1,2,......
  • hdu 1511(dp)
    解题思路:两次dp确实很巧妙,我只想到了一次dp算出最后那个数最小,其实题目要求还要保证第一个数尽可能大,一开始也没有注意到。。AC:#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#include<stdlib.h>#include<time.h>usingnamesp......
  • LeetCode 530. 二叉搜索树的最小绝对差
    题目链接:LeetCode530.二叉搜索树的最小绝对差题意:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。解题思路:递归法1既然是二叉搜索树,那么中序遍历一定是有序的,因此最小的插值一定出现在相邻的两个......
  • hdu 5102(队列+节点扩展)
    TheK-thDistanceTimeLimit:8000/4000MS(Java/Others)    MemoryLimit:65536/65536K(Java/Others)ProblemDescriptionGivenatree,whichhasnnodeintotal.Definethedistancebetweentwonodeuandvisthenumberofedgeontheirunique......