C++
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int MAXSIZE = 105;
int n, m, maze[MAXSIZE][MAXSIZE], dist[MAXSIZE][MAXSIZE];
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
queue<pair<int, int> > q;
bool legal(int x, int y) {
return x > 0 && x <= n && y > 0 && y <= m && !maze[x][y];
}
int bfs() {
memset(dist, -1, sizeof(dist));
dist[1][1] = 0;
q.push({1, 1});
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i], ny = y + dy[i];
if (!legal(nx, ny) || dist[nx][ny] != -1) {
continue;
}
dist[nx][ny] = dist[x][y] + 1;
q.push({nx, ny});
}
}
return dist[n][m];
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
scanf("%d", &maze[i][j]);
}
}
printf("%d\n", bfs());
return 0;
}
Go
package main
import "fmt"
var (
n, m int
maze [][]int
dist [][]int
dx, dy []int
queue []Pair
)
type Pair struct {
x, y int
}
func init() {
fmt.Scan(&n, &m)
maze, dist = make([][]int, n), make([][]int, n)
for i := 0; i < n; i++ {
maze[i], dist[i] = make([]int, m), make([]int, m)
for j := 0; j < m; j++ {
fmt.Scan(&maze[i][j])
dist[i][j] = -1
}
}
dx, dy = []int{-1, 1, 0, 0}, []int{0, 0, -1, 1}
queue = []Pair{}
}
func legal(x, y int) bool {
return x >= 0 && x < n && y >= 0 && y < m && (maze[x][y] == 0)
}
func bfs() int {
dist[0][0] = 0
queue = append(queue, Pair{0, 0})
for len(queue) > 0 {
front := queue[0]
queue = queue[1:]
for i := 0; i < 4; i++ {
x, y := front.x+dx[i], front.y+dy[i]
if !legal(x, y) || dist[x][y] != -1 {
continue
}
dist[x][y] = dist[front.x][front.y] + 1
queue = append(queue, Pair{x, y})
}
}
return dist[n-1][m-1]
}
func main() {
fmt.Println(bfs())
}