USACO Section 5.1 Starry Night - 有点麻烦写的题..
这道题应该一看~~基本思路就出来~~从左上角扫到右下角~~扫一个没更新过的连通块...就先与前面已经确定的比较...并且是翻成八种情况都来比较...若有符合的~~那么就确定这个连通块是前面哪个相同的...若无一符合~~就计数器++..发现新的连通块~~~但仔细想想...会好麻烦的感觉..
我是这么处理的 :
1.记录前面的连通块..我就是记录了连通块上的某点坐标..因为只要知道了一个坐标~~从这个坐标开始DFS一次就能还原出这个连通块...
相应"相同"的方向..这样在拓展同时就能判断出两个块是不是相等..试想..若题目中只能完全相等才能说是一样(只有一种形态不翻转对称)..那不就是跟着前面拓展的路经同时在拓展当前...
3.但是题目给出了8种方向..其实也好办..先人工判断出这八种形态的移动相对应的情况..也就是我手工打的turn这个表...比如说在1形态里拓展时向上走一步相等于2形态向左走一步,3形态向下走一步,4形态向左走一步,5形态向上走一步,6形态向左走一步,7形态向下走一步,8形态向右走一步.....前面的个连通块可以都假设成住一个形态..以一种形态的方式拓展~~我都是确定成了1型态~~这样就按这8个情况跟着前面某个确定好的连通块一起拓展..就可以判断出所有的情况是否有相同的.
起点相同...在记录前面连通块时我就是记录的连通块的最上面中最左边的点..而可以推出这个点在后面7个连通块中是在哪个位置...都是在连通块所有点的( MaxX or MinX , MaxY or MinY ) 上...人工判断下..所以我程序里写了那么长的判断更新...
这道题主要就是看着他给的第一个图...来推的...算法简单..但写起来繁琐...要求思路严谨..
Program:
/* ID: zzyzzy12 LANG: C++ TASK: starry*/ #include #include #include #include #include #include#include
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~