结果都是1

来源:12-2 迷宫代码实现

慕哥9561112

2020-10-30

package main

import (
“fmt”
“os”
)

func readMaze(fileName string) [][]int{
file,err:=os.Open(fileName)
if err != nil{
panic(err)
}
var row,col int
fmt.Fscanf(file,"%d %d",&row,&col)
maze:=make([][]int,row)
for i:= range maze{
maze[i] = make([]int,col)
fmt.Fscanln(file)
for j:=range maze[i]{
fmt.Fscanf(file ,"%d",&maze[i][j])
}

}

return maze

}

type point struct {
i,j int
}

var dirs = [4]point{
{-1,0},{0,-1},{0,1},{1,0},
}

func (p point) add(r point) point {
return point{p.i+r.i,p.j+r.j}
}

func (p point) at (grid [][]int) (int, bool) {
if p.i<0||p.i>=len(grid){
return 0,false
}
if p.j<0 ||p.j>=len(grid[p.i]) {
return 0,false
}

return grid[p.i][p.j], true

}
func walk(maze [][]int,start,end point) [][]int {

steps :=make([][]int,len(maze))
for i:=range steps{
	steps[i]=make([]int,len(maze[i]))
}
//创建一个存放节点数据的队列
Q :=[]point{start}
for len(Q)>0{
	cur :=Q[0]
	Q=Q[1:]
	if cur ==end{
		break
	}
	for _,dir :=range dirs{
		next :=cur.add(dir)
		val,ok:=next.at(maze)
		if !ok || val ==1 {
			continue
		}
		val,ok=next.at(steps)
		if !ok || val !=0 {
			continue
		}
		if next==start{
			continue
		}

		curSteps,_ :=next.at(steps)
		steps[next.i][next.j]=curSteps+1
		Q=append(Q,next)
	}
}
return steps

}

func main() {
maze:=readMaze(“maze/maze.in”)

steps:=walk(maze,point{0,0},point{len(maze)-1,len(maze[0])-1})
for _,row:=range steps{
	for _,col:=range row{
		fmt.Printf("%3d",col)
	}
	fmt.Println()
}

}
代码是这样结果执行出来是:
0 0 1 1 1
1 1 1 0 1
1 0 1 0 1
0 0 0 1 1
0 0 1 1 0
0 0 1 1 1
不知道是哪里的错?

写回答

2回答

不会我就学

2024-01-17

func readMaze(filename string) [][]int { //返回二维数组
   file, err := os.Open(filename)
   if err != nil {
      panic(err)
   }
   var row, col int
   fmt.Fscanf(file, "%d %d", &row, &col)
   fmt.Println(row, col)
   maze := make([][]int, row) //建造行
   fmt.Fscanln(file)
   for i := range maze {
      maze[i] = make([]int, col) //建造列
      for j := range maze[i] {
         fmt.Fscanf(file, "%d", &maze[i][j])

      }
      fmt.Fscanln(file)
   }
   return maze
}
应该是正确的

           

0
0

ccmouse

2020-11-02

在Windows下,换行符是\r\n。我的代码似乎只能正确处理\n的情况

Go语言的FScanf有这样的bug。在Windows下,我们可以在读完一行内容后,加上fmt.Fscanln(file)来解决这个问题。这个bug目前处于open状态:https://github.com/golang/go/issues/23562

看一下是不是这个原因


0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程