`
coolsooner
  • 浏览: 1313230 次
文章分类
社区版块
存档分类
最新评论

HDOJ 1175

阅读更多

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175

题意简明,连连看,判断两个位置能不能消去。“不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。”——这句话真搞笑………令解题者少作一步处理,还是不错的(否则需要在棋盘外围加一圈0)。

很快写了个DFS的程序,提交上去,RE了,提示栈溢出。于是我习惯性地认为一定是DFS所用的递归函数导致栈溢出,于是改写,用STL的stack模板模拟递归。提交,继续栈溢出……

又不淡定了,难道stack中的元素也是在栈上的,改用vector?但是至多3000个节点怎么可能溢出……

忽然意识到问题所在了,我把1000*1000的int数组放在main函数里,一行声明代码就吃了4M栈空间,当然栈溢出了,只不过在我的OS X上正常运行……估计是OS X的栈空间较大。

激动地把数组移驾到全局,提交,TLE……

看同样用DFS的解题报告,原来是我没想到更牛逼的剪枝——譬如移动到A点时,已拐了2次——记录表明有个家伙在A点时才拐了1次,最终却没能到达终点,那么可以直接结束这条支线。

多么牛逼的剪枝啊!不过最后没有用这个方法,因为我不搜索了——依次判断直线到达,拐一次到达,拐两次到达。

直线到达最容易——依次判断直线上各点是否为0。

拐一次,可以得出两条轨迹,组成一个矩形……

拐两次,先求出两条平行线,然后作两平行线的垂线……

1w ms的限时,g++下62ms AC,看来不用搜索的效果还是不错的。

吐槽一下自己的代码,太长太面向对象,解题的代码没必要这样;但代码的事,我有点强迫症……

为了抽象不同方向上的操作,把坐标x, y表示为长度为2的数组,感觉还是有点用的。

吐槽一下自己以前在vim中没把tab设置成空格,造成博客上很多代码排版不齐,这次应该没问题。

这次加注释,中文注释……



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics