Leetcode:51.N皇后

代码的思路为传统的回溯法,代码思路与全排列以及求子集的思路基本相同,利用深度优先搜索(DFS)以及剪枝操作,N皇后问题的剪枝操纵为减去同对角线以及同列的枝。

首先列出我刚开始写出的代码,能够成功运行,但是忽略一个十分重要的地方,导致运行时间和空间复杂度大大提升。

class Solution {
public:
    
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> maps;
        vector<int> map;
        return SortQueens(n, 0, map, maps);
    }
    
    bool ValidQueens(vector<int> &map, int col, int row){
        int num = map.size();
        for(int i = 0; i < num; i++){
            if(map[i] == col)
                return false;
            else if((map[i] + i) == (col + row))
                return false;
            else if((map[i] - i) == (col - row))
                return false;
        }
        return true;
    }
    
     vector<vector<string>> SortQueens(int n, int row, vector<int> &map, vector<vector<string>> &maps){ 
        int num = map.size(); 
        if(num == n){
            vector<string> ans(num, string(num, '.'));
            for(int i = 0; i < num; i++)
                ans[i][map[i]] = 'Q';
            maps.push_back(ans); 
        }
        
        for(int col = 0; col < n; col++){     
            if(ValidQueens(map, col, row)){
                map.push_back(col);
                SortQueens(n, row + 1, map, maps);
                map.pop_back();
            }
        }  
        return maps;
    } 
};

比较重要的是ValidQueens这个函数,判断方法:

0,0(Q)0,10,20,3
1,01,11,2(Q)1,3
2,02,12,22,3
3,03,13,23,3

以上为四皇后的棋盘,(0,0)以及(1,2)已经放好一个皇后,接下来而皇后放在哪里该如何判断?列方向很容易判断,对角线方向向有个特点,同一对角线横纵坐标相加或者相减为同一个常数,以此为判断(好像我给的这个例子第三行无法放置皇后了,只能进行回溯操作)。

但是这个代码跑了1500ms,占用了500M内存,因为这里有个致命错误,引用!最终结果已经存在maps中,直接通过引用就可以将其返回,我居然给SortQueen返回值,又拷贝占用很多空间,这里直接void即可,引用就是为了方便解决void无法返回数值的问题,随即纠正。

​​​​class Solution {
public:
    
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> maps;
        //vector<int> map(n, -1);
        vector<int> map;
        SortQueens(n, 0, map, maps);
        return maps;
    }
    
    bool ValidQueens(vector<int> &map, int col, int row){
        int num = map.size();
        for(int i = 0; i < num; i++){
            if(map[i] == col)
                return false;
            else if((map[i] + i) == (col + row))
                return false;
            else if((map[i] - i) == (col - row))
                return false;
        }
        return true;
    }
    
     void SortQueens(int n, int row, vector<int> &map, vector<vector<string>> &maps){ 
        int num = map.size(); 
        if(num == n){
            vector<string> ans(num, string(num, '.'));
            for(int i = 0; i < num; i++)
                ans[i][map[i]] = 'Q';
            maps.push_back(ans); 
        }
        
        for(int col = 0; col < n; col++){     
            if(ValidQueens(map, col, row)){
                map.push_back(col);
                SortQueens(n, row + 1, map, maps);
                map.pop_back();
            }
        }  
    } 
};

NICE!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值