LeetCode | N-Queens II

来源:互联网 发布:一个算法应具备的特性 编辑:程序博客网 时间:2024/06/02 23:59

题目:

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.


思路:

与http://blog.csdn.net/lanxu_yy/article/details/17243057类似,由于时间复杂度要求更高,我做了一个小优化。即判断斜线上的Queen冲突不再由遍历完成,而是用两个数组保存左斜线和右斜线的结果。左斜线上满足i+j相等的单元格都在一条斜线上,右斜线上满足i-j+n相等的单元格也都在一条斜线上。

代码:

class Solution {public:    vector<string> str;    vector<bool> rowConflict;    vector<bool> slashConflict;    vector<bool> backSlashConflict;    int count;    int totalNQueens(int n) {        for(int i=0;i<n;i++)    {        string tmp;        for(int i=0;i<n;i++)        {        tmp.push_back('.');        }    str.push_back(tmp);    }        for(int i=0;i<n;i++)    {    rowConflict.push_back(false);    }        for(int i=0;i<2*n;i++)    {    slashConflict.push_back(false);    }        for(int i=0;i<2*n;i++)    {    backSlashConflict.push_back(false);    }        count = 0;    addAQueen(0,0,n);    return count;}bool addAQueen(int i, int j, int n){    if(i == n)    {        count++;        return true;    }    if(j==n)    {        return false;    }    if(!rowConflict[j])    {if(!slashConflict[i-j+n]){    if(!backSlashConflict[i+j])    {    str[i][j] = 'Q';    rowConflict[j] = true;    slashConflict[i-j+n] = true;    backSlashConflict[i+j] = true;    bool result = addAQueen(i+1,0,n);    str[i][j] = '.';                rowConflict[j] = false;                slashConflict[i-j+n] = false;                backSlashConflict[i+j] = false;    }}}return addAQueen(i,j+1,n);}};


0 0
原创粉丝点击