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; } };