读了这题题目后都不敢用java写了,这道题我用的是c++

这道题需要使用位运算,否则最后一个数据会超时,做一点核心提示,如下图是一个6×6的棋盘,其中有两个位置放置了棋子:

_ _ _ _ _ *

_ _ _ * _ _

_ _ _ _ _ _

_ _ _ _ _ _

_ _ _ _ _ _

_ _ _ _ _ _

 

现在我们需要在第2行放棋子了(最上面一行是第0行),那么可以放在哪些位置呢?

我们先来画6条线,它们分别是从两个“*”号出发向下,向左斜下,向右斜下的射线,

且向下的射线与第2行相较于两个点,如果我们用1表示相交点,0表示没有相交的点,那么向下的线可以表示为一个二进制的整数:000101

同理,向左斜下的线可以表示为:001100

向右斜下的线可以表示为:000010

自然可知这三个二进制数的或运算是:001111

这个数表达了这一行哪些位置可以放子,其中1表示不能放子的地方,0表示可以放子的地方

 

如果选择了一个放子的位置,那么就可以计算出下一行对应的这三个二进制数了

 

我写的这个程序提交了几次,最快时最后一个数据用时0.140秒,使用位运算并没有减少计算的数量级,只是减小了常数因子,但速度提高不少

 

 

Code
posted on 2008-11-26 16:14  刘永辉  阅读(519)  评论(0编辑  收藏  举报