N-Queens II

来源:互联网 发布:java jdk官网下载 编辑:程序博客网 时间:2024/06/17 18:53

 N-Queens II

Follow up for N-Queens problem.

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

解析:递归解法,按行递归,考虑当前行应该放的位置,确定一个位置对下面所有行进行递归求解,当当前行为n行时说明之前所有行的位置合格,判断合格的函数是valid,其中visited表示第i行的皇后所放的列数,所有皇后要求不能同行同列,不能在一个对角线上,visited已经保证了不同行了,每一列是否放皇后使用vis表示,向右的对角线使用vispos表示,向左的对角线使用vissum表示,对于一个位置(i,j)它的对角线上的元素差值(i-j)都是相同的,同理向左的对角线上的和值i+j都是相同的。和N-Queen相同,只是不需要保存状态信息。

代码:

class Solution {public:    vector<vector<string>> solveNQueens(int n) {        vector<vector<string>>ans;        vector<string>path;        vector<int>visited(n,-1);        dfs(ans,path,0,n,visited);        return ans;    }            bool valid (vector<int>visited)    {        vector<bool>vis(visited.size(),false);        vector<bool>vispos(visited.size()*2+1,false);                vector<bool>vissum(visited.size()*2+1,false);        for (int i=0; i<visited.size(); i++)        {            if (visited[i]==-1)            continue;            if (vis[visited[i]]) return false;            vis[visited[i]]=true;                                  if (i>0&&visited[i-1]!=-1)            {                if (abs(visited[i]-visited[i-1])<=1)                return false;            }            if ((i<(visited.size()-1))&&(visited[i+1]!=-1))            {                if (abs(visited[i]-visited[i+1])<=1)                return false;            }            if (vispos[i-visited[i]+visited.size()])            {                return false;            }            vispos[i-visited[i]+visited.size()]=true;                                    if (vissum[i+visited[i]])            {                return false;            }            vissum[i+visited[i]]=true;        }                return true;            }    void dfs(vector<vector<string>>&ans,vector<string>&path,int row,int n,vector<int>&visited)    {        if (row==n)        {             ans.push_back(path);            // visited[row-1]=-1;             return ;        }            string temp(n,'.');            for (int j=0; j<n; j++)            {                visited[row]=j;                if (!valid(visited))                {                    visited[row]=-1;                    continue;                }                temp[j]='Q';                path.push_back(temp);                dfs(ans,path,row+1,n,visited);                path.pop_back();                temp[j]='.';            }            visited[row]=-1;               return ;    }};


0 0
原创粉丝点击