친구가 자신의 Android 휴대 전화에 비밀번호를 입력하는 것을 보았습니다. 패턴을 어떻게 만들 었는지 기억하지 못하지만 패턴이 어떻게 생겼는지 기억합니다. 관심있는 친구이기 때문에 자신의 암호가 얼마나 안전한지 알고 싶습니다. 당신의 임무는 특정 패턴을 만들 수있는 모든 방법을 계산하는 것입니다.
안드로이드 패턴 작동 방식
패턴은 3x3 그리드 노드에 그려집니다. 패턴에서 하나는 화면에서 손가락을 떼지 않고 일련의 노드를 방문합니다. 그들이 방문하는 각 노드는 에지에 의해 이전 노드에 연결됩니다. 명심해야 할 두 가지 규칙이 있습니다.
한 노드를 두 번 이상 방문 할 수 없습니다
에지가 방문하지 않은 노드를 통과하지 못할 수 있습니다
실제 안드로이드 잠금 조합에서는 일반적으로 수행하기가 어렵고 그리 일반적이지 않지만 Knight 처럼 이동할 수 있습니다. 즉, 한쪽에서 인접하지 않은 모서리로 또는 다른 방향으로 이동할 수 있습니다. 이러한 이동을 사용하는 패턴의 두 가지 예는 다음과 같습니다.
다음은 애니메이션 GIF 입니다.
패턴 해결
일반적인 패턴은 다음과 같습니다.
이와 같은 간단한 패턴으로 두 가지 방법으로 패턴을 그릴 수 있습니다. 두 느슨한 끝 중 하나에서 시작하여 강조 표시된 노드를 통해 다른 끝으로 이동할 수 있습니다. 많은 패턴, 특히 인간이 일반적으로 사용하는 패턴에 대해서는 이것이 사실이지만 모든 패턴에 대해 이것이 사실은 아닙니다.
다음 패턴을 고려하십시오.
즉시 인식 가능한 두 가지 솔루션이 있습니다. 왼쪽 상단에서 시작하는 것 :
그리고 하나는 하단 중앙에서 시작합니다.
그러나 선이 이미 선택된 지점을 통과 할 수 있기 때문에 상단 가운데에서 시작하는 추가 패턴이 있습니다.
이 특정 패턴은 3 해법이 있지만 패턴 사이 어딘가에 1 개 4의 솔루션을 가질 수있다 [표창장] .
각각의 예는 다음과 같습니다.
1.
2.
삼.
4.
I / O
노드는 0에서 9까지의 정수, 해당 문자열 또는 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)} -> {}
그림으로 모든 테스트 사례의 이미지 앨범은 여기 에서 찾을 수 있습니다 . 패턴은 파란색으로 파란색으로 표시됩니다.
채점
이것은 코드 골프입니다. 가장 적은 바이트가 이깁니다.