N-Queens

来源:互联网 发布:淘宝网包包货到付款 编辑:程序博客网 时间:2024/06/05 11:56

N-Queens

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.."]]
解析:

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

代码:

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
原创粉丝点击