迷宫游戏 小红书 golang bfs

迷宫游戏 小红书 golang bfs

看到大家的程序都很繁琐我就放心了。

基本思路就是bfs,将起点放进待处理的队列,每次出队一个元素,将其相邻的可行元素入队。
可以取消 打印生长过程 的注释,当图生长碰到终点,就输出长度,如果知道结束都没有碰到终点则输出-1.

package main

import (
	"fmt"
)

func main() {
	var n int
	var s [2]int
	var in string
	//标记矩阵
	var mapp [][]int
	fmt.Scan(&n)
	for i:=0;i<n;i++{
		fmt.Scan(&in)
		line:=[]int{}
		for j,v:=range in{
			switch v {
			case '.':
				line = append(line, 1)
			case '#':
				line = append(line, 0)
			case 'S':
				s=[2]int{i,j}
				line = append(line, 9)
			case 'E':
				//e=[2]int{i,j}
				line = append(line, 2)
			}
		}
		mapp = append(mapp, line)
	}
	//列数
	w:= len(mapp[0])
	d:=[4][2]int{{1,0},{-1,0},{0,1},{0,-1}}
	//待处理的点的队列
	queue:=[][2]int{s}
	steps,lenz:=1,1
	reachable:=false
	for i:=0;i< len(queue)&&!reachable;i++{
		if i==lenz{
			steps++
			lenz= len(queue)
			//打印生长过程
			//for _,v:=range mapp{
			//	fmt.Println(v)
			//}
			//fmt.Println("-------",steps,"-----")
			//fmt.Println()
		}
		x,y:=queue[i][0],queue[i][1]
		for i:=0;i<4;i++{
			//注意考虑溢出
			xx,yy:=(x+d[i][0]+w)%w,(y+d[i][1]+w)%w
			switch mapp[xx][yy] {
			//可以走的点标记为9
			case 1:
				mapp[xx][yy]=9
				queue = append(queue, [2]int{xx,yy}) 
			//发现终点提前结束
			case 2:
				reachable=true
				break
			}
		}
	}
	if reachable{
		fmt.Println(steps)
	}else {
		fmt.Println(-1)
	}
}

你可能感兴趣的:(算法)