zoukankan      html  css  js  c++  java
  • [LintCode] 611 Knight Shortest Path 解题报告

    Description
    Given a knight in a chessboard (a binary matrix with 0 as empty and 1 as barrier) with a source position, find the shortest path to a destination position, return the length of the route.
    Return -1 if knight can not reached.

    Notice
    source and destination must be empty.
    Knight can not enter the barrier.


    Clarification
    If the knight is at (x, y), he can get to the following positions in one step:

    (x + 1, y + 2)
    (x + 1, y - 2)
    (x - 1, y + 2)
    (x - 1, y - 2)
    (x + 2, y + 1)
    (x + 2, y - 1)
    (x - 2, y + 1)
    (x - 2, y - 1)


    Example
    [[0,0,0],
     [0,0,0],
     [0,0,0]]
    source = [2, 0] destination = [2, 2] return 2

    [[0,1,0],
     [0,0,0],
     [0,0,0]]
    source = [2, 0] destination = [2, 2] return 6

    [[0,1,0],
     [0,0,1],
     [0,0,0]]
    source = [2, 0] destination = [2, 2] return -1

    5/13/2017

    算法班,未经验证

     1 /**
     2  * Definition for a point.
     3  * public class Point {
     4  *     publoc int x, y;
     5  *     public Point() { x = 0; y = 0; }
     6  *     public Point(int a, int b) { x = a; y = b; }
     7  * }
     8  */
     9 public class Solution {
    10     /**
    11      * @param grid a chessboard included 0 (false) and 1 (true)
    12      * @param source, destination a point
    13      * @return the shortest path 
    14      */
    15     public int shortestPath(boolean[][] grid, Point source, Point destination) {
    16         // Write your code here
    17         if (grid == null || grid.length == 0 || grid[0].length == 0) {
    18             return -1;
    19         }
    20         if (grid[destination.x][destination.y] == 1 || grid[source.x][source.y] == 1) {
    21             return -1;
    22         }
    23         int[] xDirection = new int[]{1, 1, -1, -1, 2, 2, -2, -2};
    24         int[] yDirection = new int[]{2, -2, 2, -2, 1, -1, 1, -1};
    25 
    26         Queue<Point> queue = new LinkedList<Point>();
    27 
    28         boolean[][] visited = new boolean[grid.length][grid[0].length];
    29         int count = 0;
    30 
    31         queue.offer(source);
    32 
    33         while (!queue.isEmpty()) {
    34             Point p = queue.poll();
    35             if (p.x == destination.x && p.y == destination.y) return count;
    36 
    37             if (visited[p.x][p.y] || grid[p.x][p.y]) continue;
    38             visited[p.x][p.y] = true;
    39 
    40             for (int i = 0; i < xDirection.length; i++) {
    41                 int tmpX = p.x + xDirection[i];
    42                 int tmpY = p.y + yDirection[i];
    43                 if (!outOfBoundary(tmpX, tmpY, grid.length, grid[0].length)) {
    44                     queue.offer(new Pont(tmpX, tmpY));
    45                 }
    46             }
    47             count++;
    48         }
    49         return -1;
    50     }
    51     private boolean outOfBoundary(int x, int y, int xLength, int yLength) {
    52         if (x >= xLength || x < 0 || y >= yLength || y < 0) return true;
    53         return false;
    54     }
    55 }
  • 相关阅读:
    mysql 不能远程连接
    ajax 内部值 外部调用不了原因
    vm NAT方式linux上不了网 解决方法
    wordpress 在linux上配置固定url方法
    win8 报file://CBD 0xc0000034 蓝屏
    VM 打开虚拟机时报“内部错误”
    thinkphp 前后版本ajaxReturn方法的分别
    thinkphp3.2引入php 实例化类
    putty 实现不用输入用户名密码直接登陆
    jQuery 遍历
  • 原文地址:https://www.cnblogs.com/panini/p/6851612.html
Copyright © 2011-2022 走看看