当前位置: 代码迷 >> 综合 >> LintCode 611 Knight Shortest Path
  详细解决方案

LintCode 611 Knight Shortest Path

热度:29   发布时间:2023-10-28 03:59:50.0

思路

BFS,带level信息的坐标型。每次将一层元素都取出来,然后加入队列的时候将其标记为1(障碍)。

复杂度

时间复杂度O(nm)
空间复杂度O(n
m)

代码

/*** Definition for a point.* class Point {* int x;* int y;* Point() { x = 0; y = 0; }* Point(int a, int b) { x = a; y = b; }* }*/public class Solution {
    /*** @param grid: a chessboard included 0 (false) and 1 (true)* @param source: a point* @param destination: a point* @return: the shortest path */public int shortestPath(boolean[][] grid, Point source, Point destination) {
    // write your code hereif (grid.length == 0 || grid[0].length == 0) {
    return -1;}int[] dx = {
    1, 1, 2, 2, -1, -1, -2, -2};int[] dy = {
    2, -2, 1, -1, 2, -2, 1, -1};Queue<Point> queue = new LinkedList<>();queue.offer(source);grid[source.x][source.y] = true;int level = 0;while (!queue.isEmpty()) {
    int size = queue.size();for (int k = 0; k < size; k++) {
    Point cur = queue.poll();if (cur.x == destination.x && cur.y == destination.y) {
    return level;}for (int i = 0; i < 8; i++) {
    Point next = new Point(cur.x + dx[i],cur.y + dy[i]);if (inBound(grid, next) && grid[next.x][next.y] == false) {
    queue.offer(next);grid[next.x][next.y] = true;}}}level++;}return -1;}private boolean inBound(boolean[][] grid, Point next) {
    return 0 <= next.x && next.x < grid.length && 0 <= next.y && next.y < grid[0].length;}
}
  相关解决方案