Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Autosaved

...

LC 752. Open the Lock 打开转盘锁

https://leetcode.com/problems/open-the-lock/

Code Block
languagego
import "fmt"

func openLock(deadends []string, target string) int {
    var q []string
    visited := make(map[string]bool)
    
    for _, x := range deadends {
        visited[x] = true
    } 
    
    if visited["0000"] {
        return -1
    }
    
    q = append(q, "0000")
    visited["0000"] = true
    
    step := 0
    for len(q) > 0 {
        qq := q
        q = nil
        
        for _, node := range qq {
            if node == target {
                return step
            }
                        
            for _, next := range getNext(node) {
                if visited[next] {
                    continue
                }
                
                q = append(q, next)
                visited[next] = true
            }
        }
        
        step++
    }
    
    
    return -1
}

func getNext(node string) []string {
    result := make([]string, 0, 8)
    
    nb := []byte(node)
    
    add := func(i, x int) {
        v := (int(nb[i] - '0') + x + 10) % 10
        
        nb[i] = '0' + byte(v)
    }
    
    for i := 0; i < 4; i++ {
        add(i, 1)
        result = append(result, string(nb))
        add(i, -2)
        result = append(result, string(nb))
        add(i, 1)
    }
    
    return result
}