当前位置:编程学习 > C/C++ >>

leetcode:N-Queens (n皇后问题) [面试算法题]

题目: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皇后问题,题意就是求n×n矩阵中,每行放一个棋子,使得棋子所在的列和两条斜线上没有其他棋子,枚举所有可能。
dfs去遍历,考虑所有可能,row中记录每一行棋子的位置,col记录当前列是否有棋子,对角线的判断就是两点行差值和列差值是否相同。
 
当dfs深度达到n时,就表示存在满足条件的解,把当前状态图存到结果中。
 
temp(n, '.')先把字符串全部赋值成 ‘ . ' ,在吧存在棋子的位置改成’Q‘
 
 
 
int row[1000];  
    int col[1000];  
    vector<vector<string> >result;  
class Solution {  
public:  
    void dfs(int r,int n)  
    {  
        int i,j;  
        if(r==n)  
        {  
            vector<string>go;  
            for(i=0;i<n;++i)  
            {  
                string temp(n,'.');  
                temp[row[i]]='Q';  
                go.push_back(temp);  
            }  
            result.push_back(go);  
        }  
        for(i=0;i<n;++i)  
        {  
            if(col[i]==0)  
            {  
                for(j=0;j<r;++j)  
                    if(abs(j-r)==abs(i-row[j]))break;  
                if(j==r)  
                {  
                    row[r]=i;  
                    col[i]=1;  
                    dfs(r+1,n);  
                    col[i]=0;  
                    row[r]=0;  
                }  
            }  
        }  
          
    }  
    vector<vector<string> > solveNQueens(int n) {  
        result.clear();  
        dfs(0,n);  
        return result;  
    }  
};  
//      blog.csdn.net/havenoidea  

 


补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,