这是小时候玩儿过的一笔画图游戏,每条线都要画且只能画一次,画的时候笔尖不能离开纸,结束时终点必须回到起点。其实这就是欧拉回路,可以用深度优先搜索算法求解:
1)将图装入一个邻接表,并求出各节点的连接数
2)创建一个链表队列,用于存放路径中经过的顶点,首先将起点入队
3)由当前节点向下游搜索第一个邻接点(不能是自己的上游节点),将其入队,双方连接数均减1,递归搜索该邻接点的邻接点,直到无路可走,然后依次返回
4)如果最终返回的不是起点,则说明原图不是欧拉回路
且慢,我们可能只是访问了图的一部分而提前回到了起点,所以这里需要:
5)检查链表队列,找出第一个连接数不为0的节点,继续深度优先搜索,这将产生一个新的回路并自动拼接到原回路中
6)重复上述过程直到所有节点的连接数都变为0为止
下面的case对全部12个起点求解,运行结果如下: