关闭

LeetCode 051 N-Queens

标签: leetcode
113人阅读 评论(0) 收藏 举报

题目是经典的n皇后问题。即在n乘n的国际象棋棋盘上放置n个皇后,让这些皇后互相不攻击到对方。

解法:
因为一行只能放置一个皇后,所以可以按行回溯求解。在回溯过程中可以快速判断当前位置是否可行:通过3个数组b,c,d来记录每列、每条右上到坐下的斜线、每条左上到右下的斜线是否存在皇后。(更快的是通过整数存储,使用位运算来判断)

代码:

class Solution {
public:
    int *a, *b, *c, *d;
    vector<string> sol;
    vector<vector<string>> result;

    void search(int i, int n) {
        if(i == n) {
            result.push_back(sol);
            return;
        }

        for(int k = 0 ; k < n ; k++) {
            if(!b[k] && !c[i + k] && !d[i - k + n - 1]) {
                b[k] = 1;
                c[i + k] = 1;
                d[i - k + n - 1] = 1;
                sol[i][k] = 'Q';
                search(i + 1, n);
                sol[i][k] = '.';
                b[k] = 0;
                c[i + k] = 0;
                d[i - k + n - 1] = 0;
            }
        }
    }

    vector<vector<string>> solveNQueens(int n) {
        a = new int[n];
        b = new int[n];
        c = new int[2*n];
        d = new int[2*n];
        memset(a, 0, sizeof(int) * n);
        memset(b, 0, sizeof(int) * n);
        memset(c, 0, sizeof(int) * 2 * n);
        memset(d, 0, sizeof(int) * 2 * n);

        string line;
        for(int j = 0 ; j < n ; j++)
            line += '.';

        for(int i = 0 ; i < n ; i++) {
            sol.push_back(line);
        }
        search(0, n);
        return result;
    }
};
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5438次
    • 积分:769
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条