菜鸟算法-深度优先搜索-寻宝

深度搜索

  • 问题描述:
  • |[x1]|[x2]|[x3]|[x4]
    ------|-----|-----|-----|-----
    [y1]| 0 | 0 | 1 | 0
    [y2]| 0 | 0 | 0 | 0
    [y3]| 0 | 0 | 1 | 0
    [y4]| 0 | 1 |A| 0
    [y5]| 0 | 0 | 0 | 1

上面的表格是一张藏宝图的抽象,坐标中0表示空地,1表示有障碍物, A表示藏宝点,现在我们从坐标(1, 1)出发开始寻宝之旅。


这个问题其实和N数全排还是一样,我们依然用深度优先搜索的思路来想这个问题:这里有M*N个位置,每个位置最多可以选择4个方向可以走(向右、向下、向左、向上)。每当我们到达一个位置就可以用同样的方法来处理我们下一步的动作。

var treasureMap = [5][4]int{
        {0, 0, 1, 0},
        {0, 0, 0, 0},
        {0, 0, 1, 0},
        {0, 1, 0, 0},
        {0, 0, 0, 1},
}
var locationMarks [5][4]int

var dereoctions = [4][2]int{
        {1, 0},  // 向右
        {0, 1},  // 向下
        {-1, 0}, // 向左
        {0, -1}, // 向上
}

var minDistance int = 20
var targetX, targetY int = 2, 3

func DeepFirstSearch3(x, y, step int) {
        locationMarks[y][x] = 1

        if targetX == x && targetY == y {
                if step < minDistance {
                        minDistance = step
                        fmt.Println("Now distance is ", minDistance)
                        for i := 0; i < 5; i++ {
                                fmt.Println(locationMarks[i])
                        }
                }
                return
        }

        for d := 0; d < 4; d++ { // 遍历下一步的方向
                // 计算下一个坐标
                tx := x + dereoctions[d][0]
                ty := y + dereoctions[d][1]

                // 查看是否越界
                if tx < 0 || tx > 3 || ty < 0 || ty > 4 {
                        continue
                }

                // 查看下一个点是否是障碍物 或者 已经经过
                if treasureMap[ty][tx] == 0 && locationMarks[ty][tx] == 0 {
                        //locationMarks[ty][tx] = 1
                        DeepFirstSearch3(tx, ty, step+1)
                        locationMarks[ty][tx] = 0
                }
        }
        return
}

菜鸟算法-深度优先搜索-寻宝_第1张图片
结果

你可能感兴趣的:(菜鸟算法-深度优先搜索-寻宝)