您的位置:首页 > 产品设计 > UI/UE

LeetCode 笔记系列 14 N-Queen II [思考的深度问题]

2013-07-12 20:22 579 查看
题目: Follow up for N-Queens problem.

  Now, instead outputting board configurations, return the total number of distinct solutions.

public int totalNQueens(int n){
cnt = 0;
upper = (1<<n)-1 ;
Queen(0,0,0);
return cnt;
}

//为啥说大牛niub呢,看看我下面那个,再对比ld和rd,人大牛一眼就看出来了,没必要保存
//所有对角线信息啊。下一个状态,完全由当前状态决定!!
private void Queen(int row, int ld, int rd){//ld, left 对角线; rd, right 对角线
int pos, p;
if(row!=upper)
{
//so pos in binary is like, under current row/ld/rd restriction, what is available slot to put Q
pos = upper & (~(row | ld |rd));
while(pos!=0)//available is 1
{
p = pos & (-pos);//from right to left, the first "1" in pos
//now, we occupy the most right available position
pos = pos - p;//now take this available as ”Q“,pos kind of like a available slot marker
Queen(row+p,(ld+p)<<1,(rd+p)>>1);
}
}
else ++cnt;
}


Niubility N Queen
好一个不明觉厉,男默女泪的算法!

。。。。。

首先,再次承认和牛人的差距。

其次,反思,反思,深刻地反思。为毛牛人就知道这一点呢?其实所有中间信息都可以用一个整数来表示啊。

特别是那个左右对角线的事情,弄的本娃很郁闷。仔细想想,可不是嘛,当设置了一个Q以后,就是设置其左下方和右下方不能访问嘛。随着层次的深入(向最后一行靠近),对角线的状态可不就是左对角线左移,右对角线右移嘛。天,好有画面感的事情。

这里还有个小技巧。11100这个二进制数,怎么知道从右向左边第一个1的位置啊?

p = (pos) & (-pos)

我真是不知道这个,如果你也不知道负数在计算机中的表示方法的话,建议google之。

哦,这里有个关于这个算法的图图,看看有帮助。http://www.matrix67.com/blog/archives/266

我想去买这位blogger的书了。

总结:

1. 思考要有[b]深度[/b]。就是说,理解一下,当前的信息到底是怎么样得出来的,而不是看表象。

2. 要有[b]画面感[/b]。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: