读了这题题目后都不敢用java写了,这道题我用的是c++
这道题需要使用位运算,否则最后一个数据会超时,做一点核心提示,如下图是一个6×6的棋盘,其中有两个位置放置了棋子:
_ _ _ _ _ *
_ _ _ * _ _
_ _ _ _ _ _
_ _ _ _ _ _
_ _ _ _ _ _
_ _ _ _ _ _
现在我们需要在第2行放棋子了(最上面一行是第0行),那么可以放在哪些位置呢?
我们先来画6条线,它们分别是从两个“*”号出发向下,向左斜下,向右斜下的射线,
且向下的射线与第2行相较于两个点,如果我们用1表示相交点,0表示没有相交的点,那么向下的线可以表示为一个二进制的整数:000101
同理,向左斜下的线可以表示为:001100
向右斜下的线可以表示为:000010
自然可知这三个二进制数的或运算是:001111
这个数表达了这一行哪些位置可以放子,其中1表示不能放子的地方,0表示可以放子的地方
如果选择了一个放子的位置,那么就可以计算出下一行对应的这三个二进制数了
我写的这个程序提交了几次,最快时最后一个数据用时0.140秒,使用位运算并没有减少计算的数量级,只是减小了常数因子,但速度提高不少
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)