LeetCode 051 N-Queens

题目是经典的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;
    }
};
阅读更多
文章标签: leetcode
上一篇LeetCode 050 Pow(x, n)
下一篇LeetCode 052 N-Queens II
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭