0,1 매트릭스에서 재귀 경로 찾기 (및 가능한 모든 경로 저장) java

엘리 란 지브

0,1 값을 포함하는 int matrix 내의 위치로 역 추적하지 않고 경로를 찾는 재귀 메서드를 코딩하려고합니다. 0은 밟아도 괜찮고 1은 밟아도 괜찮습니다. 또한 50 개 이상의 이동 경로를 제한하고 있습니다.

위치는 행 및 열 값 (x, y)이있는 개체입니다. locationEquals는 두 위치가 같으면 true를 반환하고 그렇지 않으면 false를 반환하는 함수입니다. 맵 변수는 경로 찾기를 시도하는 행렬입니다.

private static List<List<Location>> options = new ArrayList<List<Location>>();
public static void PathFind(List<Location> path)
{
 Location current = path.get(path.size() - 1);
    boolean done = false;
    if(locationEquals(current,new Location(24,38)))
    {
        options.add(path);
        return;
    }
    if(path.size() > 50) done = true;
    if(!done)
    {
    try
    {
    if(map[current.row][current.col + 1] == 0)
    {
    if(!path.contains(new Location(current.row, current.col + 1)))
        {
            List<Location> temp = path;
            temp.add(new Location(current.row, current.col + 1));
            PathFind(temp);
        }
    }
    }
    catch (Exception e){}
            try
    {
    if(map[current.row - 1][current.col] == 0)
    {
        if(!path.contains(new Location(current.row - 1, current.col)))
        {
            List<Location> temp = path;
            temp.add(new Location(current.row - 1, current.col));
            PathFind(temp);
        }
    }
    }
    catch (Exception e){}
    try
    {
    if(map[current.row][current.col - 1] == 0)
    {
        if(!path.contains(new Location(current.row, current.col - 1)))
        {
            List<Location> temp = path;
            temp.add(new Location(current.row, current.col - 1));
            PathFind(temp);
        }
    }
    }
    catch (Exception e){}
    try
    {
    if(map[current.row + 1][current.col] == 0)
    {
        if(!path.contains(new Location(current.row + 1, current.col)))
        {
            List<Location> temp = path;
            temp.add(new Location(current.row + 1, current.col));
            PathFind(temp);
        }
    }
    }
    catch (Exception e){}
    }

다음 코드를 실행 한 후 'options'가 비어 있으며 이는 방법을 찾지 못했음을 의미합니다. 그러나이 매트릭스에는 확실히 방법이 있으므로 찾을 수없는 내 코드의 버그입니다.

도론 야코블레프-골라 니

문제는 재귀의 다음 단계로 이동할 때마다 새 목록을 만들지 않는다는 것입니다 (임시 변수는 경로의 복사본이 아니라 경로에 대한 참조 일 뿐이므로 실제로 임시 변수가 아닙니다).

이 문제를 해결하기 위해, 나는 교체 List<Location> temp = path;와 함께List<Location> temp = new ArrayList<>(path);

따라서 코드는 다음과 같습니다.

private static List<List<Location>> options = new ArrayList<List<Location>>();
public static void PathFind(List<Location> path) {
    Location current = path.get(path.size() - 1);
    boolean done = false;
    if (locationEquals(current, new Location(24, 38))) {
        options.add(path);
        return;
    }
    if (path.size() > 50) done = true;
    if (!done) {
        try {
            if (map[current.row][current.col + 1] == 0) {
                if (!path.contains(new Location(current.row, current.col + 1))) {
                    List<Location> temp = new ArrayList<>(path);
                    temp.add(new Location(current.row, current.col + 1));
                    PathFind(temp);
                }
            }
        } catch (Exception e) {
        }
        try {
            if (map[current.row - 1][current.col] == 0) {
                if (!path.contains(new Location(current.row - 1, current.col))) {
                    List<Location> temp = new ArrayList<>(path);
                    temp.add(new Location(current.row - 1, current.col));
                    PathFind(temp);
                }
            }
        } catch (Exception e) {
        }
        try {
            if (map[current.row][current.col - 1] == 0) {
                if (!path.contains(new Location(current.row, current.col - 1))) {
                    List<Location> temp = new ArrayList<>(path);
                    temp.add(new Location(current.row, current.col - 1));
                    PathFind(temp);
                }
            }
        } catch (Exception e) {
        }
        try {
            if (map[current.row + 1][current.col] == 0) {
                if (!path.contains(new Location(current.row + 1, current.col))) {
                    List<Location> temp = new ArrayList<>(path);
                    temp.add(new Location(current.row + 1, current.col));
                    PathFind(temp);
                }
            }
        } catch (Exception e) {
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

경로 찾기 재귀가 Prolog에서 메모리 부족

분류에서Dev

사전에서 가능한 모든 경로 (x 단계)를 찾는 재귀 함수

분류에서Dev

여행하는 세일즈맨 : 재귀로 가능한 모든 경로 얻기

분류에서Dev

파이썬에서 재귀를 통해 살아남는 목록에 문제가 있습니다. 그래프에서 가능한 모든 경로 찾기

분류에서Dev

이진 트리에서 가장 긴 짝수 값 경로 찾기, 해당 경로의 반환 길이, 비 재귀

분류에서Dev

및 배열에서 모든 자식 범주를 재귀 적으로 찾기-PHP

분류에서Dev

재귀 적으로 확장자를 가진 모든 파일 찾기

분류에서Dev

postgres에서 재귀 경로 찾기

분류에서Dev

순환없이 그래프에서 가능한 모든 경로 찾기

분류에서Dev

순서대로 그룹 배열에서 가능한 모든 조합을 재귀 적으로 검색합니다. 배열 크기 및 그룹 크기는 1-X이며 X는 큰 수가 아닙니다.

분류에서Dev

재귀를 사용하여 가능한 가장 오래 증가하는 모든 하위 시퀀스 찾기

분류에서Dev

내 Poco에 재귀 적으로 폴더 경로의 모든 디렉토리 가져 오기

분류에서Dev

모든 Android 장치에 대한 공통 저장 경로

분류에서Dev

재귀 경로 찾기

분류에서Dev

재귀 방법으로 가능한 모든 숫자를 찾는 방법

분류에서Dev

가능한 모든 경로가 저장된 Javascript의 검색 트리 알고리즘?

분류에서Dev

대규모 (C)에서 가장 큰 2 개의 인덱스를 재귀 적으로 찾기

분류에서Dev

그래프에서 길이가 2 인 모든 경로 찾기

분류에서Dev

파이썬에서 완전히 연결된 그래프에서 가능한 모든 경로 찾기

분류에서Dev

Chrome의 모든 기록을 재사용 가능한 형식으로 저장하는 방법이 있습니까?

분류에서Dev

가능한 모든 경로를 찾는 DFS는 매우 느립니다.

분류에서Dev

모든 경로에 게시 기능

분류에서Dev

Matlab Brute Force Search를 사용하여 그래프에서 가능한 모든 경로 찾기

분류에서Dev

모든 고유 경로가 전달되는 '가장 짧은 범위의 인덱스'크기 찾기

분류에서Dev

재귀 적으로 3과 5를 곱한 모든 자연수 찾기

분류에서Dev

asp.net 5에서 파일 경로 가져 오기 및 저장

분류에서Dev

재귀. 시작점과 최대 거리가 주어진 가장 긴 경로를 모두 찾습니다.

분류에서Dev

무 방향주기에서 모든 쌍의 최단 경로를 찾는 가장 빠른 방법

분류에서Dev

가능한 모든 조합으로 문자열 배열을 재귀 적으로 확장

Related 관련 기사

  1. 1

    경로 찾기 재귀가 Prolog에서 메모리 부족

  2. 2

    사전에서 가능한 모든 경로 (x 단계)를 찾는 재귀 함수

  3. 3

    여행하는 세일즈맨 : 재귀로 가능한 모든 경로 얻기

  4. 4

    파이썬에서 재귀를 통해 살아남는 목록에 문제가 있습니다. 그래프에서 가능한 모든 경로 찾기

  5. 5

    이진 트리에서 가장 긴 짝수 값 경로 찾기, 해당 경로의 반환 길이, 비 재귀

  6. 6

    및 배열에서 모든 자식 범주를 재귀 적으로 찾기-PHP

  7. 7

    재귀 적으로 확장자를 가진 모든 파일 찾기

  8. 8

    postgres에서 재귀 경로 찾기

  9. 9

    순환없이 그래프에서 가능한 모든 경로 찾기

  10. 10

    순서대로 그룹 배열에서 가능한 모든 조합을 재귀 적으로 검색합니다. 배열 크기 및 그룹 크기는 1-X이며 X는 큰 수가 아닙니다.

  11. 11

    재귀를 사용하여 가능한 가장 오래 증가하는 모든 하위 시퀀스 찾기

  12. 12

    내 Poco에 재귀 적으로 폴더 경로의 모든 디렉토리 가져 오기

  13. 13

    모든 Android 장치에 대한 공통 저장 경로

  14. 14

    재귀 경로 찾기

  15. 15

    재귀 방법으로 가능한 모든 숫자를 찾는 방법

  16. 16

    가능한 모든 경로가 저장된 Javascript의 검색 트리 알고리즘?

  17. 17

    대규모 (C)에서 가장 큰 2 개의 인덱스를 재귀 적으로 찾기

  18. 18

    그래프에서 길이가 2 인 모든 경로 찾기

  19. 19

    파이썬에서 완전히 연결된 그래프에서 가능한 모든 경로 찾기

  20. 20

    Chrome의 모든 기록을 재사용 가능한 형식으로 저장하는 방법이 있습니까?

  21. 21

    가능한 모든 경로를 찾는 DFS는 매우 느립니다.

  22. 22

    모든 경로에 게시 기능

  23. 23

    Matlab Brute Force Search를 사용하여 그래프에서 가능한 모든 경로 찾기

  24. 24

    모든 고유 경로가 전달되는 '가장 짧은 범위의 인덱스'크기 찾기

  25. 25

    재귀 적으로 3과 5를 곱한 모든 자연수 찾기

  26. 26

    asp.net 5에서 파일 경로 가져 오기 및 저장

  27. 27

    재귀. 시작점과 최대 거리가 주어진 가장 긴 경로를 모두 찾습니다.

  28. 28

    무 방향주기에서 모든 쌍의 최단 경로를 찾는 가장 빠른 방법

  29. 29

    가능한 모든 조합으로 문자열 배열을 재귀 적으로 확장

뜨겁다태그

보관