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 }
  • 相关阅读:
    如何用cmd命令加密文件夹
    C++异常处理
    STRTOK
    如何生成Detours.lib——Detours的使用准备
    学习C++心得与值得一看的书
    工作两年后的感悟
    MFC十八个简单问题转载
    程序员的五种非技术错误 转载
    用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
    CxImage
  • 原文地址:https://www.cnblogs.com/panini/p/6851612.html
Copyright © 2011-2022 走看看