递归之迷宫问题No.13

一、对迷宫问题分析

  • 如图所示:红色区域代表围栏不能通行,小球从左上角走到右下角为闯关成功
  • 将图形转换为数字代替(用切片表示即可)如下图:1代表围栏;0代表通路;2代表走的路径
  • 小球得到的路径,和程序员设置的找路策略有关即:可以先使用(下右上左),再改成(上右下左)

二、代码实现

package main
import (
    "fmt"
)
//编写一个函数,完成老鼠找路
//myMap *[8][7]int:地图,保证是同一个地图,使用引用
//i,j 表示对地图的哪个点进行测试
func SetWay(myMap *[8][7]int, i int, j int) bool {
    //分析出什么情况下,就找到出路
    //myMap[6][5] == 2
    if myMap[6][5] == 2 {
        return true
    } else {
        //说明要继续找
        if myMap[i][j] == 0 { //如果这个点是可以探测
            //假设这个点是可以通, 但是需要探测 上下左右
            //换一个策略 下右上左
            myMap[i][j] = 2
            if SetWay(myMap, i + 1, j) { //下
                return true
            } else if SetWay(myMap, i , j + 1) { //右
                return true
            } else if SetWay(myMap, i - 1, j) { //上
                return true
            } else if SetWay(myMap, i , j - 1) { //左
                return true
            } else { // 死路
                myMap[i][j] = 3
                return false
            }
        } else { // 说明这个点不能探测,为 1,是强
            return false
        }
    }
}

func main() {
    //先创建一个二维数组,模拟迷宫
    //规则
    //1. 如果元素的值为 1 ,就是墙
    //2. 如果元素的值为 0, 是没有走过的点
    //3. 如果元素的值为 2, 是一个通路
    //4. 如果元素的值为 3, 是走过的点,但是走不通
    var myMap [8][7]int
    //先把地图的最上和最下设置为 1
    for i := 0 ; i < 7 ; i++ {
        myMap[0][i] = 1
        myMap[7][i] = 1
    }
    //先把地图的最左和最右设置为 1
    for i := 0 ; i < 8 ; i++ {
        myMap[i][0] = 1
        myMap[i][6] = 1
    }
    myMap[3][1] = 1
    myMap[3][2] = 1
    //myMap[1][2] = 1
    //myMap[2][2] = 1
    //输出地图
    fmt.Println("迷宫")
    for i := 0; i < 8; i++ {
        for j := 0; j < 7; j++ {
            fmt.Print(myMap[i][j], "      ")
        }
        fmt.Println()
    }
    //使用测试
    SetWay(&myMap, 1, 1)
    fmt.Println("探测完毕....")
    //输出地图
    for i := 0; i < 8; i++ {
        for j := 0; j < 7; j++ {
            fmt.Print(myMap[i][j], "      ")
        }
        fmt.Println()
    }
}

猜你喜欢

转载自blog.csdn.net/m0_38004619/article/details/106534455