2012-05-08 2 views
-3

나는 NxN 셀의 그리드를 가지고있다 (Array [N] [N]으로 정의 된 2 차원 배열을 생각해 보라).N 행 N 격자의 모든 경로를 계산하는 알고리즘, non-repeat

  1. 어떤 셀이 단일 경로 내에서 두 번 포함되어 있지 :

    어떤 알고리즘 모든 셀에있는 모든 셀에서 모든 경로 A [I] [J]은 [K] [1]을 계산한다.

  2. 인접한 대각선, 수평 및 수직 이동이 모두 허용됩니다.
  3. 알고리즘은 평균 속도가 가장 빠릅니다.
  4. 최소 메모리가 사용됩니다.
+0

좋은 질문입니다. 동적 프로그래밍 문제처럼 보입니다. – aioobe

+0

미리 계산 된 하드 코딩 된 답변이있는 알고리즘을 사용하기 전에 '5 by 5'를 'N by N'으로 변경합니다. – aioobe

+1

Djkistra의 최단 경로 알고리즘에 대해 더 자세히 알고 싶다면 여기를 클릭하십시오. http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm –

답변

0

실제 경로는 물론 그 수가 아니라고 가정합니다.

당신은 동일한 경로 탐구 정점에 visited 설정을 유지하고, 이미 동일한 경로에서 발견 된 정점을 탐험 방지 DFS를 사용하여 얻을 수 있습니다.

의사 코드 :

DFS(v,target,visited): 
    if (v == target): 
     print path to v from the initial sorce 
     return 
    visited.add(v) 
    for each vertex u such that u is a neighbor of v: 
     if (u is not in visited): 
      u.parent <- v 
      DFS(u,target,visited) 
    visited.remove(v) 

with DFS(source,target,{}) 호출 [{}visited 세트이다].

1

너비 우선 검색은 원하는 것을 정확하게 수행합니다. 모든 경로를 생성 할 때 가장 빠르지 않습니다.

+1

너비 우선 탐색 * 모든 경로는 어떻게됩니까? 그것은 일반적으로 * visited * 집합에 이미있는 노드에 도달 할 때 하나의 경로를 종료합니다. – aioobe

+0

http://stackoverflow.com/questions/713508/find-the-paths-between-two-given-nodes/713579#713579 – t3hn00b

+0

죄송하지만 수정하지 않은 BFS는 모든 경로를 찾지 못합니다. 예 : find path between (0,0) and (1,2) : BFS가 가능한 경로'(0,0) -> (1,1) -> (1,2)'를 생성한다고 가정하면, BFS는'visited' set을 유지하기 때문에'(1, 0) -> (1,0) -> (1,1) -> (1,2) , 1)'은 두 번째 경로에서 다시 탐색되지 않습니다. BFS를 구체적으로 수정 한 경우 자세한 내용을 설명해주십시오. 표준 BFS는 여기에서 실패합니다. – amit