码迷,mamicode.com
首页 > 其他好文 > 详细

面试题 08.12. 八皇后

时间:2020-08-17 17:23:04      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:面试题   lse   int   ++   ==   题目   cci   code   public   

题目描述链接:https://leetcode-cn.com/problems/eight-queens-lcci/

解题思路:DFS。要求不同行,不同列,不同对角线。对于不同行每搜索完一行,则

继续搜索下一行,即可保证不位于同一行。对于不同列和不同对角线需用一个数组记录

每一行当中皇后的列值,对于每一个要尝试放置的位置和之前行当中已经放置的皇后进行

比较看是否满足。对于列值的判断只需根据数组的记录的即可,而对角线判断,根据如果

在同一条对角线上则两个点的行值和列值的和或者差相等则它们位于同一条对角线上。

因此,每尝试一个位置,则要求该位置同之前行已经放置的进行比较,如果满足条件则继续

向下一行搜索。最后,每搜索完一个位置,记得取消标记,以实现回溯。

LeetCode C++求解代码如下:

class Solution {
public:
    vector<vector<string>> res;
    int que[1000];
    int N;
    vector<vector<string>> solveNQueens(int n) {
           N=n;
          dfs(0);
        return res;
    }
    void dfs(int row){
        if(row==N){
         vector<string>ans;
         for(int i=0;i<N;i++){
             string temp="";
            for(int j=0;j<N;j++){
                if(j==que[i]){
                    temp+=Q;
                }
                else{
                    temp+=.;
                }
            }
            ans.push_back(temp);
         }
          res.push_back(ans);   
          return;
        }
        
        if(row==0){
            for(int i=0;i<N;i++){
                que[i]=-1;
            }
        }
        for(int i=0;i<N;i++){//(row,i)
            int j=0;
            for(j=0;j<row;j++){//(j,que[j])
               if(que[j]==i||que[j]-j==i-row||que[j]+j==i+row){
                   break;
               }
            }
            if(j==row){//满足条件
               que[row]=i;
               dfs(row+1);
               que[row]=-1;
            }
        }
        
        
    }  


};

 

面试题 08.12. 八皇后

标签:面试题   lse   int   ++   ==   题目   cci   code   public   

原文地址:https://www.cnblogs.com/zzw-/p/13504389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!