Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
递归回溯法的灵活运用。
新思维:
这里优化点是从底往上累计加起来,速度是快很多的,不过这个这个题目要想到从底往上加起来还是有难度的。
4到5星级难度吧。
原来12个queens测试的时候好像是1000ms多吧,现在才9个用例就很简单了。
int totalNQueens(int n)
{
vector<int> q(n,-1);
return queens(q, n);
}
int queens(vector<int> &q, int n, int r = 0)
{
if (r == n) return 1;
int sum = 0;
for (int i = 0; i < n; i++)
{
if (isLegal(q, r, i))
{
q[r] = i;
sum += queens(q, n, r+1);//q[r] = -1;
}
}
return sum;
}
bool isLegal(vector<int> &q, int r, int c)
{
for (int i = 0; i < r; i++)
if (q[i] == c || q[i]-i == c-r || q[i]+i == c+r) return false;
return true;
}
Leetcode上的超级位运算程序,大概明白什么意思,不过太极品了,估计不是记熟的话,在面试不可能写出这样的程序。
而且这应该是位运算的大师才能创造出这样的算法吧,看过这个算法的人都会被震惊的。
运行速度极快,原来leetcode上12queens才80ms左右。不过现在leetcode上降低难度了,只有9个queens的用例,就显示不出这个超级算法的优势了。
class Solution {
public:
int cnt,upper;
int totalNQueens(int n)
{
cnt = 0;
upper = (1<<n)-1 ;
Queen(0,0,0);
return cnt;
}
void Queen(int row,int ld,int rd)
{
int pos,p;
if(row!=upper)
{
pos = upper & (~(row | ld |rd));
while(pos!=0)
{
p = pos & (-pos);
pos = pos - p;
Queen(row+p,(ld+p)<<1,(rd+p)>>1);
}
}
else ++cnt;
}
};