이 과제는 2D 미로를 1D 미로로 변환하는 것입니다.
개요
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | |A| | B| A B A -- D
+ + + + +-+-+ + + + + +-+-+ \ | C -- D
| | | | | | | | \ | D -- E
+-+-+ +-+-+ + +-+-+ +-+-+ + \ | E -- F
| | |C D E F| C---D-E---F E -- G
+-+-+-+ +-+ + +-+-+-+ +-+ + | | B -- F
| | | | G | | .---G | F -- J
+ +-+-+-+ + + + +-+-+-+ + + .' / | G -- H
| | | | |H|I |J| H I-' J G -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 1 Figure 2 Figure 3
이 도전의 목적을 위해, 전통적인 2D 미로는 격자 점으로 형성된 직사각형 미로입니다.
- 닫혀 있습니다 (외부 림은 벽으로 연결됨).
- 모든 격자 점은 벽에 연결됩니다
- 연결되어 있습니다 (두 칸마다 X와 Y 사이에 경로가 있습니다)
- 비 주기적입니다 (역 추적없이 공간 X에서 X 로의 경로가 없습니다)
그림 1은 전통적인 2D 미로를 보여줍니다. 이 미로는 관심 분야가 3 가지 있습니다.
- 막 다른 골목 -사용 가능한 경로가 하나 뿐인 곳
- 복도 -사용 가능한 경로가 두 개있는 장소
- 결정 지점 -사용 가능한 경로가 3-4 개있는 곳
그러한 미로마다, 데드 엔드와 결정 포인트가 노드 인 그래프를 생성 할 수 있으며 복도를 따라 경로로 연결된 두 노드 사이에 가장자리가 있습니다. 그림 2는 이러한 노드에 레이블이 붙은 동일한 미로를 나타내고 그림 3은 미로의 그래프 (ASCII 및 Graphviz 도트 표기법으로 표시)입니다.
1D 미로
1D 미로는 뒤틀림 지점을 포함하며 쌍으로되어 있으며 문자를 사용하여 식별됩니다 (두 경우 모두). 그림 4는 1D 미로의 예를 보여줍니다. 이것은도 5에 도시 된 바와 같이, 높이가 1 인 2D 미로와 동일하다. 특히도 5에서 +
, 로 표시된 격자 점 위치는 왼쪽에서 오른쪽으로 교대 로 나타난다 ; 1D 미로에서 가장 왼쪽 벽으로 시작하는 다른 모든 문자도 격자 점입니다.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| D| D E|G E F| F | G | | D| D E|G E F| F | G |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 4 Figure 5
이 미로를 탐색하는 규칙은 다음과 같습니다. 모든 움직임은 앞으로 ( >
) 또는 뒤로 ( <
) 로 표시 될 수 있습니다 . 여기에서 앞뒤로 기본적으로 직관적 인 공간 인식과 같은 의미를 갖습니다. 앞으로 오른쪽으로 즉시 이동하고 왼쪽으로 뒤로 이동합니다.
변형 점은 연결을 비대칭 적으로 이웃과 교환하는 위치를 나타냅니다. 이웃에서 날실 지점으로 오는 경우 두 날실 지점의 위치가 바뀝니다. 워프 지점에서 이웃으로 오는 경우 서로 바뀌지 않습니다. 예를 들어, 그림 6에서 1에서 뒤로 이동하면 2로 이동합니다 (1이 G의 이웃이기 때문에 이웃에서 이동하기 때문에 점 2와 @가 교환 됨). 2 (워프 포인트 G)에서 앞으로 이동하면 3으로 이동합니다 (여기서 워프 포인트에서 시작하므로 스왑이 없습니다). 마찬가지로 3에서 뒤로 이동하면 @로 이동합니다.
54 2367 89^ @1
| D| D E|G E F| F | G |
Y X
Figure 6
그림 6은 일련의 이동을 사용하여 X에서 Y로 이동하는 예제를 보여줍니다 <<>><>>>>>
. 이러한 동작 123456789^
은 순서대로 각각 레이블이 지정된 지점으로 이동합니다 . 다음 섹션의 코드 스 니펫을 사용하여 자유롭게 탐색하십시오.
2D를 1D로 변환
1D 미로가 주어지면, 각각의 노드가 막 다른 골목 또는 날 실점 쌍이고 그래프가 복도를 따라 연결된 두 노드 사이에 존재하는 그래프를 만들 수 있습니다. 이 그래프를 통해 1D와 2D 미로를 비교할 수 있습니다.
예를 들어, 그림 4의 1D 미로는 그림 1의 동일한 미로입니다. 이유를보기 위해 그림 7은 막 다른 곳에 레이블을 추가합니다. 이 레이블을 사용하여 그래프를 작성하면 그림 7의 그래프는 다시 그림 3입니다. 그림 8은이 그래프를 구성한 것입니다.
| D| D E|G E F| F | G |
A C B J H I
Figure 7
| D| D E|G E F| F | G |
+ + + + + + + + + + + + + + + <- lattice points
|A |C | |B J|H I| <- dead ends
|A D|C D E|G E F|B F J|H G I| <- all nodes (dead ends+warp points); i.e.:
"where each end is either a dead end
or a warp point pair"; note that each
pair of warp points is the same node.
|A-D|C-D-E|G-E-F|B-F-J|H-G-I| <- corridors; note each is a connection, since
1 2 3 4 5 6 7 8 9 "edges exist between any two nodes
connected along a corridor"
graph { graph {
A -- D // 1 <----> A -- D
C -- D // 2 <----> C -- D
D -- E // 3 <----> D -- E
G -- E // 4 <----> E -- G
E -- F // 5 <----> E -- F
B -- F // 6 <----> B -- F
F -- J // 7 <----> F -- J
H -- G // 8 <----> G -- H
G -- I // 9 <----> G -- I
} ^ }
Built from | From Figure 3
1D maze `-> isomorphic mappings
Figure 8
(각 그래프의 레이블과 레이아웃은 설명 목적으로 정렬되도록 인위적으로 선택되었습니다. 일반적으로 그래프 동 형사상 문제입니다 ).
다음 스 니펫은 1D 미로의 역학과 1D 미로, 등가 그래프 및 2D 미로 간의 연결을 시각화하는 데 도움이되도록 제공됩니다.
이 스 니펫에서 1D 미로를 탐색하면 마지막 두 노드가 강조 표시됩니다. 동등 노드와 2D 미로에서 동일한 노드가 같은 방식으로 강조 표시됩니다.
일반적으로 기존의 2D 미로의 경우이 유형의 동등한 1D 미로를 만들 수 있습니다. 약간 더 복잡한 예는 그림 9입니다.
+-+-+-+-+-+-+ +-+-+-+-+-+-+ graph {
| | | | | |A| | |B| A B A -- D
+ + + + + + + + + + + + + + \ / C -- D
| | | | | | | | | | \ / D -- E
+-+-+ + +-+-+ +-+-+ + +-+-+ \ / B -- E
| | |C D E | C---D-E E -- F
+-+-+-+ +-+ + +-+-+-+ +-+ + |\ E -- I
| | | | F | | .---F \ F -- G
+ +-+-+-+ + + + +-+-+-+ + + .' / \ G -- H
| | | | |G|H |I| G H-' I H -- I
+-+-+-+-+-+-+ +-+-+-+-+-+-+ (ascii) } // (graphviz dot)
Figure 9 Figure 10 Figure 11
| D| D E |F E | F | | D| D E |F E | F |
A C I B G H
Figure 12 Figure 13
이 미로는 경로가 네 개인 노드를 가지고 있습니다 (그림 10의 E). 그림 11은 그래프를 보여줍니다. 도 12는 동등한 1D 미로이다. 그리고 그림 13은 그림 11과 비교할 수있는 막 다른 라벨이있는 동일한 미로를 보여줍니다.
도전
2D 미로를 입력으로 받으면 2D 미로를 날 실점이있는 1D 미로로 변환하는 함수 나 프로그램을 작성하십시오. 뒤틀림 포인트는 각 52 개의 문자를 사용할 수 있습니다.
입력 보장 (입력에서 충족되지 않은 경우 처리 할 필요가 없음) :
- 입력 미로가 연결되어 있습니다 (즉, 언제 어디서나 다른 곳으로 갈 수 있습니다).
- 입력 미로가 닫힙니다.
- 입력 미로는 직사각형입니다.
- 모든 격자 점은를 사용
+
합니다. - 같은 행에서 격자 점 사이의 모든 벽은
|
- 동일한 기둥에서 격자 점 사이의 모든 벽이 사용
-
됩니다. - 모든 공간은 경로의 일부입니다 (그리고 모두 미로 내부).
- 경로는 모든 공간입니다 (이것은 항상 전통적이고 뒤 틀리지 않습니다)
- 경로는 정확히 하나의 공간 너비입니다.
- 미로는 격자의 점을 연결하여 만들어집니다.
- 미로의 그래프에는 총 노드 수가 52 개를 넘지 않습니다 (즉, 데드 엔드 + 결정 포인트).
출력 형식:
- 출력은 1D 미로를 보여주는 한 줄 이어야합니다 .
- 출력에는 선행 / 후행 공백이 없어야합니다. 후행 줄 바꿈은 괜찮습니다.
- 첫 문자와 다른 모든 문자는 격자 점입니다.
- 모든 벽은 격자 점에 있어야합니다. 그리고 그들 사이의 모든 왜곡 점.
- 1D 미로의 그래프는 2D 미로의 그래프와 동일해야합니다.
- 1D 미로는 작아야합니다. 격자가 아닌 모든 점은 막 다른 곳 (즉, 벽에 인접)이거나 변형 점이되어야합니다.
- 문자 만 당신의 출력은 워프 지점이어야한다. 각 워프 포인트는 선에서 정확히 두 번 발생합니다.
예:
| D| D E|G E F| F | G | <- (1,2) The single line output
+ + + + + + + + + + + + + + + <- lattice point spacing... (3)
(4,6) lattice points are all walls or spaces
(5) See Figure 8
(7) D, E, F, G appear twice; no other labels
이것은 코드 골프입니다. 승자는 바이트 수가 가장 적은 정확한 비루 홀 제출입니다.
테스팅
사소한 미로에 대한 많은 올바른 출력이 있기 때문에이 도전에 대한 테스트 사례는 없습니다.
그러나 C ++로 체커를 만들었습니다 (이 체커는 두 가지 솔루션을 그래프 정규화를 통해 그래프로 표시합니다 ).
또한 올바른 형식을 설명하는 데 도움이되는 몇 가지 예가 있습니다.
실시 예 1
+-+-+-+-+-+-+
| | | |
+ + + + +-+-+
| | | |
+-+-+ +-+-+ +
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E|G E F| F | G |
실시 예 2
+-+-+-+-+-+-+
| | | | |
+ + + + + + +
| | | | |
+-+-+ + +-+-+
| |
+-+-+-+ +-+ +
| | |
+ +-+-+-+ + +
| | | |
+-+-+-+-+-+-+
->
| D| D E |F E | F |