Leetcode:N-Queens II

N-Queens II:

Follow up for N-Queens problem.

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


跟上一题的方法一样,只是不用打印棋盘,只需要用一个变量记录可行解的个数即可。在网上看到一个代码,充分利用了指针,运行速度十分之快。看来要提高代码的运行效率,灵活运用指针是个好办法。

class Solution {
private:
    bool *row, *column, *diagonal, *r_diagonal;
    int count;
    
public:
    void init(int n) {
        row = new bool[n];
        memset(row, true, sizeof(bool) * n);
        column = new bool[n];
        memset(column, true, sizeof(bool) * n);
        diagonal = new bool[n * 2];
        memset(diagonal, true, sizeof(bool) * n * 2);
        r_diagonal = new bool[n * 2];
        memset(r_diagonal, true, sizeof(bool) * n * 2);
        
        count = 0;
    }
    
    void del() {
        delete [] row;
        delete [] column;
        delete [] diagonal;
        delete [] r_diagonal;
    }
    
    
    void search(int n, int num) {
        if (num == n) {
            count++;
            return;
        }
        
        for (int i = 0; i < n; i++) {
            if (row[i] && column[i] && diagonal[i + num] && r_diagonal[i - num + n]) {
                row[i] = false;
                column[i] = false;
                diagonal[i + num]  = false;
                r_diagonal[i - num + n] = false;                
                
                search(n, num + 1);
                
                row[i] = true;
                column[i] = true;
                diagonal[i + num]  = true;
                r_diagonal[i - num + n] = true;                
            }
        }
    }
    
    int totalNQueens(int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function        
        init(n);
        search(n, 0);
        del();
        return count;
    }
};

memset()函数:

memset是计算机中C++语言函数。将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针。


void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值