Leetcode N-Queens II

N-Queens II

  Total Accepted: 4450  Total Submissions: 14913 My Submissions

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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值