N-Queens II:
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
![](http://www.leetcode.com/wp-content/uploads/2012/03/8-queens.png)
跟上一题的方法一样,只是不用打印棋盘,只需要用一个变量记录可行解的个数即可。在网上看到一个代码,充分利用了指针,运行速度十分之快。看来要提高代码的运行效率,灵活运用指针是个好办法。
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:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。