서로 연결된 방 목록이있는 경우 격리 된 방 그룹을 어떻게 찾을 수 있습니까?


9

나는 작은 도적 같은 것을 만들려고 노력하고 있으며 무작위로 생성되는 방과 복도까지 갔다. 각 방은 실체 개체이며 복도로 연결된 다른 방의 배열 목록을 포함합니다.

연결되지 않은 방을 골라 낼 수는 있지만 서로 연결되어 있지만 대부분의 다른 방에는 연결되지 않은 방을 어떻게 알 수 있습니까?

문제를 더 잘 설명하기 위해 콘솔의 이미지가 보그 레벨입니다. 방 5와 6은 서로 연결되어 있습니다. 이를 감지하기 위해 어떤 알고리즘을 사용할 수 있습니까?

여기에 이미지 설명을 입력하십시오


이미지 사용에 문제가 있습니까? 해당 pastebin 링크는 한 달 동안 만 지속됩니다.
MichaelHouse

네, 처음에 당신이 한 일을 이해하지 못했습니다. 죄송합니다. 변경 사항을 되돌 렸습니다.
petervaz '10

1
왜이 너무을 구성하지 않습니다 수 없습니다 처음에 별도의 객실 수? 아니면 고립 된 세트를 원하십니까?
AlbeyAmakiir

@AlbeyAmakiir 아래의 다른 의견에서 말했듯이지도를 채울 때까지 시행 착오로 객실을 별도로 생성 한 다음 연결 루틴을 실행하고 다른 섬을 연결하기 위해 다른 루틴을 실행합니다. 나는 그것이 너무 복잡하지만 다른 방법으로는 이해할 수 없다는 것을 알고 있습니다.
petervaz

답변:


14

전체 객실 목록으로 시작하십시오. 시작 방을 선택하십시오. 해당 방에서 연결된 모든 방으로 이동합니다. 방문하는 각 회의실에 대해 회의실 목록에서 해당 회의실을 제거하고 목록 A에 추가하십시오 . 모든 연결을 방문한 후에는 목록에 남아있는 모든 객실이 시작 방 또는 목록 A 의 모든 객실에 연결되지 않습니다 .

그런 다음 전체 목록에서 남아있는 방을 선택하고 다시 탐색하여 계속 진행할 수 있습니다. 이번에는 목록 B에 추가합니다 . 원래 목록에 더 이상 회의실이 없을 때까지이 프로세스를 계속하십시오. 이제 연결된 모든 회의실 세트의 목록이 있습니다.

이와 같은 문제는 이론 문제를 그래프로 나타 내기 위해 쉽게 적용 할 수 있습니다. 예를 들어 위에서 설명한 문제는 연결 과 직접 관련이 있습니다 .


1
모든 검색 트리 알고리즘이 작동해야합니다. 또는이 문제를 피하기 위해 생성 알고리즘을 변경할 수 있습니다. 생성 알고리즘을 변경하면 시작 방에 연결된 임의의 수의 방을 생성하고 다음 각 방에 연결된 임의의 수의 방을 생성하는 경우 기존 방 사이에 임의의 연결을 추가하여 바로 가기로 물건을 꾸밀 수 있습니다. 등. 개인적으로 검색 트리 알고리즘을 수행합니다.
벤자민 위험 존슨

매우 논리적입니다. 나는 피곤해야한다. 당신의 도움을 주셔서 감사합니다. 최대한 빨리 수락합니다.
petervaz

@BenjaminDangerJohnson 귀하의 의견은이 답변이 아닌 질문에 더 적합한 것 같습니다.
MichaelHouse

@petervaz 문제 없습니다. CS 학위는 결국 그 용도로 사용됩니다.
MichaelHouse

@ BenjaminDangerJohnson 내 생성 알고리즘은 공간을 채울 때까지 임의의 방을 배치하고 나중에 연결을 찾습니다. = P 생성을 변경하기 전에 연결을 수정하려고합니다.
petervaz

9

룸 모음은 본질적으로 그래프이며 문제는 해당 그래프에서 연결된 구성 요소 ( "섬") 를 찾는 것으로 요약됩니다 .

연결된 구성 요소를 찾는 간단한 방법 은 각 정점에서 BFS (폭 우선 검색)를 수행하는 것입니다. 정점 A에서 BFS를 수행하면 정점 A가 속한 연결된 구성 요소의 모든 정점이 표시됩니다.

따라서 기본적으로 임의의 정점으로 시작하고 BFS를 수행하고 발생한 각 정점을 첫 번째 "섬"의 구성원으로 표시합니다. 그런 다음 표시되지 않은 다음 정점으로 이동하여 BFS를 다시 수행합니다. 이번에는 레이블 지정에 정점이 두 번째 "섬"의 구성원으로 표시되었습니다.


4

방을 정점 그래프정점 으로 표시 할 수 있습니다 . 그렇게하면 잘 알려진 알고리즘을 적용하여 문제를 해결할 수 있습니다.

예를 들어 Dijkstra의 알고리즘 은 그래프에서 주어진 시작 정점에 대한 최단 경로 트리 를 생성합니다 . 이 트리는 시작점에서 도달 가능한 모든 정점을 포함합니다. 그런 다음 나무에없는 정점이 다른 섬의 일부라고 추론 할 수 있습니다. 모든 섬을 나타내는 트리를 얻기 위해이 정점에 알고리즘을 적용 할 수 있습니다.


1
방향이없는 그래프조차도 할 수 있습니다 ... 단방향으로 경로를 제외하고.
Aron_dc

@Aron_dc, 맞습니다. 방을 무 방향 그래프에 꼭짓점으로 표시하고 Kruskal의 알고리즘을 사용하여 비슷한 결과를 얻을 수 있습니다. 방금 petervaz가 연결을 나타내는 방식으로 인해 직접 그래프로 그림을 제안하는 것이 좋습니다. 즉, Room 1> 3
Asakeron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.