BFS를 사용하는 스네이크 래더

Shubham Prashar

스네이크 래더 보드가 주어지면 0 번째 정점에서 마지막 정점까지의 최소 거리를 찾아야합니다. (0 번째 정점에서 우리는 주사위를 던지고 앞으로 나아갑니다)

여기에서 문제에 대해 읽어보십시오-> LINK

내 코드 :

from collections import defaultdict

global INT_MAX
INT_MAX = 3 ** 38


class Graph:
    def __init__(self):
        self.vertList = defaultdict(list)

    def addEdge(self, u, v):
        self.vertList[u].append(v)

    def distanceBFS(self, src, target):
        queue = []
        queue.append(src)
        distanceDict = {}
        for v in self.vertList:
            distanceDict[v] = INT_MAX
        distanceDict[src] = 0
        visited = set()

        while (len(queue) > 0):
            curr = queue.pop(0)
            visited.add(curr)

            for vertex in self.vertList[curr]:
                if vertex not in visited:
                    queue.append(vertex)
                    distanceDict[vertex] = distanceDict[curr] + 1

        print(distanceDict[target])

    def solveSnakesLadder(self):
        snakeLadderDict = {2: 13, 5: 2, 9: 18, 18: 11, 17: -13, 20: -14, 24: -8, 25: 10, 32: -2, 34: -22}
        # we have 36 boxes --> i
        # we can throw a dice at each of these 36 boxes and it can be from 1 to 6
        # j is new position on the board after throwing a dice
        for i in range(0, 37):
            for dice in range(1, 7):
                j = i + dice
                if j in snakeLadderDict:
                    j += snakeLadderDict[j]
                if j <= 36:
                    self.addEdge(i, j)
        self.distanceBFS(0, 36)


g = Graph()
g.solveSnakesLadder()

전류 출력 :

10

올바른 출력 :

4

내가 여기서 뭘 잘못하고 있니? 논리와 관련이 있습니까? 대기열에 추가하기 전에 distanceDict의 값을 확인할 수도 있지만 방문한 세트는 동일한 작업을 수행합니다!

크리슈나 차 우라 시아

기본적으로 문제는 다음 코드 블록에 있습니다.

    queue.append(src)
    distanceDict[src] = 0
    visited = set()
    while (len(queue) > 0):
        curr = queue.pop(0)
        visited.add(curr)

        for vertex in self.vertList[curr]:
            if vertex not in visited:
                queue.append(vertex)
                distanceDict[vertex] = distanceDict[curr] + 1

다음 기본 그래프로 동일하게 설명하려고합니다.

여기에 이미지 설명 입력

아래 그래프 에서 꼭지점에서 꼭지점 1까지 의 최단 경로를 찾아야한다고 가정 3합니다. 위의 구현을 사용하면 다음과 같은 반복 작업이 수행됩니다.

  1. 1Queue에 정점 추가 Q하고 거리를0
  2. 다음으로, 당신은 팝업 1에서 Q에서 while루프 및 방문으로 표시
  3. 다음으로 모든 이웃을 방문하여 대기열에 추가합니다 Q.

따라서이 시점에서 다른 개체의 상태는 다음과 같습니다.

우리는 정점이 2있고 3큐에 Q있고 distance사전은 다음과 같을 것입니다. distance[1] = 0, distance[2] = 1, distance[3] = 1그리고 이것은 우리가 아직 정점 2배열 3추가하지 않았기 때문에 문제 visited가 시작되는 곳입니다. 우리가 방문하면 다음 반복에서이 정점의 거리를 다시 업데이트하기 시작할 것입니다. 다른 이웃들로부터 다시.

  1. 다시 알고리즘으로 돌아가서 이제 다시 while루프 의 시작 과 여기에서 pop정점 2으로 이동하여 방문한 것으로 표시합니다.
  2. 다음에 방문하지 않은 이웃을 살펴볼 3때 우리는 이미 방문한 것을 다시 방문하고 distance잘못된 값으로 사전을 업데이트합니다 .

정점 2과 그 이웃 을 방문한 후 다른 오브젝트의 상태는 다음과 같습니다.

3큐에 정점 이 있고 거리 사전은 distance[1] = 0, distance[2] = 1, distance[3] = 2. distance[3]반복에서 본 것처럼 잘못 업데이트되었습니다.

그러나 수정은 우리가 다른 이웃을 통해 큐에 다시 넣지 않도록 정점을 방문한 직후 방문한 것으로 표시해야하는 매우 간단합니다.

지금 쯤이면 BFS 함수에 대한 올바른 구현이 주어진 것과 같아야한다고 이미 짐작했을 것입니다.

from collections import defaultdict

global INT_MAX
INT_MAX = 3 ** 38


class Graph:
    def __init__(self):
        self.vertList = defaultdict(list)

    def addEdge(self, u, v):
        self.vertList[u].append(v)

    def distanceBFS(self, src, target):
        queue = []
        queue.append(src)
        distanceDict = {}
        for v in self.vertList:
            distanceDict[v] = INT_MAX
        distanceDict[src] = 0
        visited = set()
        visited.add(src)
        while (len(queue) > 0):
            curr = queue.pop(0)

            for vertex in self.vertList[curr]:
                if vertex not in visited:
                    queue.append(vertex)
                    visited.add(vertex)
                    distanceDict[vertex] = distanceDict[curr] + 1

        print(distanceDict[target])



    def solveSnakesLadder(self):
        snakeLadderDict = {2: 13, 5: 2, 9: 18, 18: 11, 17: -13, 20: -14, 24: -8, 25: 10, 32: -2, 34: -22}
        # we have 36 boxes --> i
        # we can throw a dice at each of these 36 boxes and it can be from 1 to 6
        # j is new position on the board after throwing a dice
        for i in range(0, 37):
            for dice in range(1, 7):
                j = i + dice
                if j in snakeLadderDict:
                    j += snakeLadderDict[j]
                if j <= 36:
                    self.addEdge(i, j)
        self.distanceBFS(0, 36)


g = Graph()
g.solveSnakesLadder()

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

토네이도 요청에서 스크래피 스파이더를 여러 번 실행하는 방법

분류에서Dev

스크래피 스파이더 파이썬을 사용하여 <ol> <li>에서 가치를 얻는 방법

분류에서Dev

네트워크 익스텐더를 사용하여 사용자 이름이 필요한 WiFi 네트워크에 연결

분류에서Dev

무 방향 가중치 그래프에 BFS를 사용하는 단일 소스 최단 경로

분류에서Dev

자바 스크립트를 사용하는 웹 사이트 스크래핑

분류에서Dev

네이티브 스크립트를 사용한 정적 그래프

분류에서Dev

신속하고 객관적인 C를 사용하는 브리징 헤더 및 프레임 워크의 네임 스페이스 충돌

분류에서Dev

게스트 / 이더넷 / 광섬유 네트워크를 설정하는 방법

분류에서Dev

BeautifulSoup으로 테이블 헤더를 스크래핑하는 동안 ".text"를 사용하여 원하지 않는 HTML을 제거 할 수없는 이유

분류에서Dev

Kotlin 익명 클래스를 네이티브 자바 스크립트 함수의 인수로 사용하는 방법은 무엇입니까?

분류에서Dev

자바 스크립트 네임 스페이스를 사용하는 방법?

분류에서Dev

셀레늄을 사용하는 자바 스크립트 렌더링 웹 사이트를위한 웹 스크래핑

분류에서Dev

Repository 클래스에서 observeForever를 사용하는 것이 좋은 습관입니까? db + 네트워크 페이지 목록

분류에서Dev

JavaScript로 데이터를 렌더링하는 웹 사이트를 스크래핑하는 방법

분류에서Dev

Python ctypes를 사용하여 C ++ 네임 스페이스 및 클래스에 액세스하는 방법

분류에서Dev

BFS는 Adjecency 매트릭스를 사용하여

분류에서Dev

플래시에서 프리 로더를 사용해야하는 이유

분류에서Dev

네트워크 폴더를 마운트하면 노틸러스를 여는 데 너무 오래 걸립니다.

분류에서Dev

자바 스크립트를 사용하여 구현 된 헤더에 자바 스크립트를 사용하는 CSS 클래스 추가

분류에서Dev

NullPointerException이는 ArrayList 클래스의 크기는 ()를 사용하는 경우

분류에서Dev

스크래피를 사용하는 MySQL 데이터베이스 오류

분류에서Dev

vb를 사용하여 특정 폴더 아래에서 Excel의 행 수를 찾는 스크립트

분류에서Dev

PHP에서 네임 스페이스가있는 클래스를 사용하는 방법은 무엇입니까?

분류에서Dev

BoundServices에 액세스하기 위해 바인더 클래스를 상속하는 다른 클래스를 사용하는 이유는 무엇입니까?

분류에서Dev

Generics (?), Object를 사용하거나 클래스를 분리하는 것이 "더 나은"것입니까?

분류에서Dev

자바 스크립트에서 사용자 정의 네임 스페이스 또는 클래스를 만드는 방법

분류에서Dev

스크래피를 사용하여 노래를 스크 레이 핑하는 방법

분류에서Dev

Zeitwerk 자동 로더를 사용하는 Rails 6의 네임 스페이스 서비스 개체

분류에서Dev

링크 및 오류를 따르지 않는 스크래피 스파이더

Related 관련 기사

  1. 1

    토네이도 요청에서 스크래피 스파이더를 여러 번 실행하는 방법

  2. 2

    스크래피 스파이더 파이썬을 사용하여 <ol> <li>에서 가치를 얻는 방법

  3. 3

    네트워크 익스텐더를 사용하여 사용자 이름이 필요한 WiFi 네트워크에 연결

  4. 4

    무 방향 가중치 그래프에 BFS를 사용하는 단일 소스 최단 경로

  5. 5

    자바 스크립트를 사용하는 웹 사이트 스크래핑

  6. 6

    네이티브 스크립트를 사용한 정적 그래프

  7. 7

    신속하고 객관적인 C를 사용하는 브리징 헤더 및 프레임 워크의 네임 스페이스 충돌

  8. 8

    게스트 / 이더넷 / 광섬유 네트워크를 설정하는 방법

  9. 9

    BeautifulSoup으로 테이블 헤더를 스크래핑하는 동안 ".text"를 사용하여 원하지 않는 HTML을 제거 할 수없는 이유

  10. 10

    Kotlin 익명 클래스를 네이티브 자바 스크립트 함수의 인수로 사용하는 방법은 무엇입니까?

  11. 11

    자바 스크립트 네임 스페이스를 사용하는 방법?

  12. 12

    셀레늄을 사용하는 자바 스크립트 렌더링 웹 사이트를위한 웹 스크래핑

  13. 13

    Repository 클래스에서 observeForever를 사용하는 것이 좋은 습관입니까? db + 네트워크 페이지 목록

  14. 14

    JavaScript로 데이터를 렌더링하는 웹 사이트를 스크래핑하는 방법

  15. 15

    Python ctypes를 사용하여 C ++ 네임 스페이스 및 클래스에 액세스하는 방법

  16. 16

    BFS는 Adjecency 매트릭스를 사용하여

  17. 17

    플래시에서 프리 로더를 사용해야하는 이유

  18. 18

    네트워크 폴더를 마운트하면 노틸러스를 여는 데 너무 오래 걸립니다.

  19. 19

    자바 스크립트를 사용하여 구현 된 헤더에 자바 스크립트를 사용하는 CSS 클래스 추가

  20. 20

    NullPointerException이는 ArrayList 클래스의 크기는 ()를 사용하는 경우

  21. 21

    스크래피를 사용하는 MySQL 데이터베이스 오류

  22. 22

    vb를 사용하여 특정 폴더 아래에서 Excel의 행 수를 찾는 스크립트

  23. 23

    PHP에서 네임 스페이스가있는 클래스를 사용하는 방법은 무엇입니까?

  24. 24

    BoundServices에 액세스하기 위해 바인더 클래스를 상속하는 다른 클래스를 사용하는 이유는 무엇입니까?

  25. 25

    Generics (?), Object를 사용하거나 클래스를 분리하는 것이 "더 나은"것입니까?

  26. 26

    자바 스크립트에서 사용자 정의 네임 스페이스 또는 클래스를 만드는 방법

  27. 27

    스크래피를 사용하여 노래를 스크 레이 핑하는 방법

  28. 28

    Zeitwerk 자동 로더를 사용하는 Rails 6의 네임 스페이스 서비스 개체

  29. 29

    링크 및 오류를 따르지 않는 스크래피 스파이더

뜨겁다태그

보관