[Leetcode 51, hard] N-Queens I

Problem:

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.."]
]

Analysis:


Solutions:

C++:

    bool IsSafeLean(int row, int col, vector<int> seizedColumns, int row_bound)
    {
	    for(int i = 1; row - i >= 0 && col + i < row_bound; ++i) {
		    if(seizedColumns[row - i] == col + i)
			    return false;
	    }

	    for(int i = 1; row - i >= 0 && col - i >= 0; ++i) {
		    if(seizedColumns[row - i] == col - i)
			    return false;
	    }

	    return true;
    }

    void FindPlacements(vector<int> seizedColumns, int row, int row_bound, vector<vector<string> >& sols) {
	    if(row == row_bound) {
		    vector<string> placement;
		    for(int i = 0; i < seizedColumns.size(); ++i) {
			    string row = "";
			    for(int j = 0; j < row_bound; ++j) {
				    if(j == seizedColumns[i])
					    row.push_back('Q');
				    else
					    row.push_back('.');
			    }
			    placement.push_back(row);
		    }
		    sols.push_back(placement);
	    } else {
		    for(int col = 0; col < row_bound; ++col) {
			    if(!seizedColumns.empty()) {
                    int index = 0;
				    for(; index < seizedColumns.size(); ++index) {
					    if(col == seizedColumns[index])
						    break;
				    }

				    if(index < seizedColumns.size() || (index == seizedColumns.size() && !IsSafeLean(row, col, seizedColumns, row_bound)))
					    continue;
			    }

			    seizedColumns.push_back(col);
			    FindPlacements(seizedColumns, row + 1, row_bound, sols);
			    seizedColumns.erase(seizedColumns.end() - 1);
		    }
	    }
    }

    vector<vector<string> > solveNQueens(int n) {
	    vector<vector<string> > sols;
	    vector<int> seizedColumns;

	    FindPlacements(seizedColumns, 0, n, sols);

	    return sols;
    }
Java :


Python:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值