最近玩了一款手游,是一笔画的内容,突然又想起来小时候...哈哈瞬间很怀念有木有,小时候对这样的游戏也痴迷到不行。
*不过长大了玩游戏的心情都不一样了,程序员做久了就非得想从里面找规律...这不还真的发现了一些小规律,然后游戏就瞬间变得无聊了起来。
以下是四个比较有用的结论↓↓↓
1.只有2个分支的节点可以被简化为一条线
这个图再熟悉不过了吧,怎么画就不用多说了吧?0->2->4->1->3->0(呵呵程序员不从0开始对不起自己)
这个图其实就是典型的可以按2个分支的节点来化简,0-2-4路径上只有2一个节点,所以可以将2忽略掉,变成0->4,脑海中的画面就变成了这个样子:
继续化简,0-4-1中4又可以忽略掉,那么0->1又出来了...这时简化成什么了?怎么画就不用说了吧!
2.孤岛可以简化成一个节点来处理,前提是经过节点是就要遍历它
图中0,1,2形成了一个孤岛(姑且这么叫吧),3,4,5形成一个孤岛,6,7,8形成一个孤岛,9,10,11形成一个孤岛,当我们经过孤岛节点比如1时我们就要优先去遍历他的孤岛,比如1->0->1->1这样对整个图的路径没有任何影响,图就可以简化成如下的样子:
简单了吧?
3.若以偶数节点为开始必然也以该偶数节点为结束,反过来以偶数节点未结束意味着它一定是起点
上面的图中,假如我们以节点0开始,因为0是偶数节点,那么我们的一笔画也将以节点0结束。
至于原因嘛,也很简单。我们假如从0开始向1划线,那么一笔画的路径如下图:
偶数节点之所以要达到偶数,那么它必须一进一出一进一出啊!
由此,便引出了我们最常用也最有效的结论↓↓↓
4.一个闭合的图形中必然只包含0个或者2个奇数边节点。
这个结论非常重要!!!
绝大多数图要从这个结论入手!!!
原因也很简单,也是上面的一进一出。要证明它也很简单
首先我们假设一个包含2N + 1条边的节点,我们分两种情况讨论:
1.以该节点画起,那么从我们一进一出来看,经过节点的路线必然是:
出->进->出->进......出->进->出->进......这个过程有N次出和N次进,再一次回到了该节点。那么此时该节点就只含有一条边可以出去了,所以该节点必然不是一笔画的终点。我们需要接盘侠...
从性质2来看,任何一个偶数节点都不会当接盘侠,人家成双入对,一进一出。那么我们只能猜想接盘侠应该也是一个奇数节点。下面我们来讨论情况2,看看奇数节点愿不愿意做接盘侠...
2.如果某个奇数节点不是起点,那么可以想象经过它的路径必然是是:
进->出->进->出...进->出->进->出...经过N次进和N次出,该节点还剩下一条路径,并且路径已经出去了,最后只能是由它来接盘了有木有!想再往外抛也没地抛了有木有!这盘不接也得接啊...
从以上的2点论证我们可以得出结论,若图中存在一个奇数节点就必然存在另一个奇数节点来接盘,因为偶数点不肯接。如果存在大于2个奇数点将造成其他奇数点无盘可接的尴尬。所以奇数点必然不会大于2个。所以奇数点的个数要么是0要么是2,而且是2时必然是一个起点一个终点。
OK!!!由以上几个结论我们基本就可以无脑游戏了
1.第一步寻找图中有无奇数节点,如果有,找出这对奇数节点并从某个奇数节点开始画起
2.如果没有奇数节点,那么任意一个偶数节点都可以当成起始点,当然选择边比较多的节点更容易画。
OK,我们还是来举几个栗子吧:
以下是我总结的无法被一笔画成的情形,可以来坑队友,哈哈,给他出个难题。
1.任何闭合图形如果存在的奇数边节点不是0个或者2个都无法被都无法被一笔画成
2.任意包含大于2条非闭合边的图形无法被一笔画成
3.包含2个节点的非闭合图形,简化后的闭合图形起始和终止节点必然落在2个奇数边节点上,否则无法被一笔画成
特殊情况
当某些复杂的情况下要求某个边要多次经过时可以按照经过的次数算节点的维度,还有某些边要求特定方向通过,比较复杂,我们下次再分解。