迷宫的最短路径 java_用队列求解迷宫最短路径及其应用(围住神经猫)

该博客探讨如何使用Java求解M×N迷宫的最短路径问题,从指定入口到出口。通过构建顺序队并采用顺时针搜索策略,成功找到路径并应用到围住神经猫游戏。文中还提供了Go语言的实现代码,并展示了运行结果。
摘要由CSDN通过智能技术生成

问题

给定一个M×N的迷宫图,求一条从指定入口到出口的最短路径.假设迷宫图如图所示(M=8, N=8)

f4c5f8c4a07a66c23bdc175d37088956.png

对于图中的每个方块,空白表示通道,阴影表示墙。所求路径必须是简单路径,即在求得路径上不能重复出现同一通道块。

为了算法方便,在迷宫外围加了一道围墙。

对应迷宫数组为:

var gameMap = [M + 2][N + 2]int{

{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},

{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},

{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},

{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},

{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},

{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},

{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

}

实现

go语言实现求解:

package main

import (

"fmt"

)

const (

M = 8

N = 8

)

// 方块类型

type Box struct {

i int // 方块行号

j int // 方块列号

pre int // 上一个方块在队列中位置

}

// 顺序队

type Queue struct {

data []Box

front int

rear int

}

var (

gameMap = [M + 2][N + 2]int{

{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},

{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},

{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},

{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},

{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},

{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},

{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},

{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

}

)

func gameSearch(xStart, yStart, xEnd, yEnd int) bool {

var i, j, di int

find := false

var queue Queue

queue.data = []Box{}

queue.front = -1

queue.rear = -1

queue.rear++

queue.data = append(queue.data, Box{})

queue.data[queue.rear].i = xStart

queue.data[queue.rear].j = yStart // (xStart, yStart)进队

queue.data[queue.rear].pre = -1

gameMap[xStart][yStart] = -1

for queue.front != queue.rear && !find {

queue.front++

i = queue.data[queue.front].i

j = queue.data[queue.front].j

if i == xEnd && j == yEnd {

find = true

printPath(&queue, queue.front)

return true

}

// 顺时针

for di = 0; di < 4; di++ {

switch di {

case 0:

i = queue.data[queue.front].i - 1

j = queue.data[queue.front].j

case 1:

i = queue.data[queue.front].i

j = queue.data[queue.front].j + 1

case 2:

i = queue.data[queue.front].i + 1

j = queue.data[queue.front].j

case 3:

i = queue.data[queue.front].i

j = queue.data[queue.front].j - 1

}

if gameMap[i][j] == 0 {

queue.rear++

queue.data = append(queue.data, Box{})

queue.data[queue.rear].i = i

queue.data[queue.rear].j = j

queue.data[queue.rear].pre = queue.front

gameMap[i][j] = -1

}

}

}

return false

}

func printPath(queue *Queue, front int) {

var k, j, ns = front, 0, 0

var maxSize = len(queue.data)

fmt.Println("\n")

for k != 0 {

j = k

k = queue.data[k].pre

queue.data[j].pre = -1

}

k = 0

fmt.Println("迷宫路径如下:\n")

for k < maxSize {

if queue.data[k].pre == -1 {

ns++

fmt.Printf("\t(%d, %d)", queue.data[k].i, queue.data[k].j)

if ns%5 == 0 {

fmt.Println("\n")

}

}

k++

}

}

func main() {

gameSearch(1, 1, 8, 8)

}

运行结果

128fbc6aba5e78d1d0e1e58312e516e1.png

应用

围住神经猫

bfbc4ba39ba4ab444d81a8b2d558dd8b.png

游戏使用C#写的,项目源码

下载体验

最后

附上我喜欢的歌的英文翻译

心做し

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值