Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
根据N-Queens代码做一些小改动
class Solution {
public:
int totalNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
char* A = new char[n];
memset(A,-1,n);
int ret = 0;
putQueens(0,n,ret,A);
return ret;
}
void putQueens(int i,int n,int &ret, char* A)
{
if(i == n) {
ret++;
A[n-1] = -1;
return;
}
int j ;
for(j = 0; j < n;j++)
{
int flag = 1;
for(int k = 0;k < i;k++)
{
if(A[k] == j ||(i+j-k >=0 && i+j-k < n && A[k] == i+j-k)||
(j-i+k >= 0 && j-i+k < n && A[k] == j-i+k)) {
flag = 0;
break;
}
}
if(flag){
A[i] = j;
putQueens(i+1,n,ret,A);
}
}
if(i == 0 && j == n) return;
A[i-1] = -1;
return;
}
};
1336 milli secs.
同样可能通过对称性简化,也可以参考这个位运算程序优化
http://java-mans.iteye.com/blog/1648510