假设您看到您的朋友在他们的Android手机中输入了他或她的密码。您不记得他们是如何制作图案的,但是您仍然记得图案的外观。作为您关心的朋友,您想知道他们的密码有多安全。您的工作是计算形成特定图案的所有方式。
Android模式如何运作
模式是在3x3的节点网格上绘制的。在一种模式中,无需访问屏幕即可访问一系列节点。他们访问的每个节点都通过一条边连接到前一个节点。要记住两个规则。
您最多只能访问一个节点
边缘可能无法通过未访问的节点
请注意,尽管通常很难执行,因此在实际的android锁组合中并不常见,但可以像Knight一样移动。即,可以从一侧移动到不相邻的拐角处或以另一种方式移动。这是采用此举的两种模式示例:
这是正在执行的动画Gif。
解决模式
典型的模式可能如下所示:
对于这种简单的模式,有两种方法可以绘制两种模式。您可以从两个松散的一端开始,然后穿过突出显示的节点到达另一个节点。尽管对于许多模式而言都是如此,但对于人类通常采用的模式而言,并非对所有模式都如此。
考虑以下模式:
有两种立即可识别的解决方案。从左上方开始的一个:
还有一个从底部中心开始:
但是,因为一旦选择了一条线,就允许它通过一个点,因此从顶部中间开始有一个附加的花样:
这个特定的模式有3个解决方案,但是模式可以有1到4个解决方案之间的任何位置[需要引用]。
以下是每个示例的一些示例:
1。
2。
3。
4。
输入输出
节点可以表示为零到九之间的整数,它们的等效字符串或a到i(或A到I)的字符。每个节点必须具有这些集合之一中的唯一表示。
解决方案将由包含节点表示形式的有序容器表示。节点的顺序必须与传递顺序相同。
模式将由节点对的无序容器表示。每对代表一条开始连接该对中两个点的边。模式表示不是唯一的。
您将通过标准输入方法将模式表示作为输入,并通过标准输出方法输出创建相同模式的所有可能解决方案。
您可以假设每个输入将至少具有一个解决方案,并将连接至少4个节点。
如果您愿意或被语言选择所迫,则可以选择使用有序容器代替无序容器。
测试用例
节点按以下模式排列:
0 1 2
3 4 5
6 7 8
让我们{...}
成为一个无序的容器,[...]
成为一个有序的容器,然后(...)
成为一对。
以下输入和输出应匹配
{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}
可以在此处找到所有测试用例的imgur相册作为图片。模式以红色显示在蓝色解决方案中。
计分
这是代码高尔夫。最少的字节数获胜。