[Leetcode] N-Queens

本文介绍了一种使用回溯法解决N皇后问题的方法,并提供了一个C++实现示例。通过深度优先搜索(DFS),该算法能够找到所有有效的棋盘配置,使得N个皇后互不攻击。

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

Given an integer n, return all distinct solutions to the n-queens puzzle.

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

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

 回溯法,DFS,没啥好说的。

 1 class Solution {
 2 public:
 3     bool isValid(vector<string> &board, int x, int y) {
 4         for (int i = 0; i < x; ++i) {
 5             if (board[i][y] == 'Q') return false;
 6         }
 7         for (int i = 0; i < board.size(); ++i) {
 8             for (int j = 0; j < board.size(); ++j) {
 9                 if (i != x && j != y && i-j == x-y && board[i][j] == 'Q')
10                     return false;
11                 if (i != x && j != y && i+j == x+y && board[i][j] == 'Q')
12                     return false;
13             }
14         }
15         return true;
16     }
17     
18     void solveHelper(vector<vector<string> > &res, vector<string> &board, int idx) {
19         if (idx == board.size()) {
20             res.push_back(board);
21             return;
22         }
23         for (int i = 0; i < board.size(); ++i) {
24             board[idx][i] = 'Q';
25             if (isValid(board, idx, i)) {
26                 solveHelper(res, board, idx + 1);
27             }
28             board[idx][i] = '.';
29         }
30     }
31     
32     vector<vector<string> > solveNQueens(int n) {
33         vector<vector<string> > res;
34         vector<string> board;
35         string row;
36         for (int i = 0; i < n; ++i) {
37             row.push_back('.');
38         }
39         for (int i = 0; i < n; ++i) {
40             board.push_back(row);
41         }
42         solveHelper(res, board, 0);
43         return res;
44     }
45 };

 

 

转载于:https://www.cnblogs.com/easonliu/p/3671450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值