Skip to content

Latest commit

 

History

History
 
 

n0051. N-Queens

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

N-Queens ⭐⭐⭐

题目内容

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

上图为 8 皇后问题的一种解法。

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

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

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

解法

// Author: Netcan @ https://github.com/netcan/Leetcode-Rust
// Zhihu: https://www.zhihu.com/people/netcan

use std::iter;

impl Solution {
    pub fn solve_n_queens(n: i32) -> Vec<Vec<String>> {
        let mut board: Vec<Vec<bool>> = iter::repeat(
                iter::repeat(false).take(n as usize).collect()
            ).take(n as usize).collect();
        let mut solv: Vec<Vec<String>> = Vec::new();
        Solution::total_n_queens_(0, &mut board, &mut solv);
        solv
    }

    fn check(pos: (usize, usize), board: &mut Vec<Vec<bool>>) -> bool {
        let n = board.len();
        for j in 0..n {
            for i in 0..n {
                if j == pos.0 || i == pos.1 ||
                    j + i == pos.1 + pos.0 || i + pos.0 == pos.1 + j {
                        if board[j][i] {
                            return false;
                        }
                }
            }
        }
        true
    }

    fn total_n_queens_(depth: usize, board: &mut Vec<Vec<bool>>, solv: &mut Vec<Vec<String>>) {
        let n = board.len();
        if depth == n {
            solv.push(
                board.iter().map(|v| {
                    v.iter().map(|x| {
                        if *x { "Q".to_string() } else { ".".to_string() }
                    }).collect::<Vec<String>>().join("")
                }).collect()
            );
            return;
        }
        for i in 0..n {
            // 可放置
            if Solution::check((depth, i), board) {
                board[depth][i] = true;
                Solution::total_n_queens_(depth + 1, board, solv);
                board[depth][i] = false;
            }
        }
    }
}