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 }
  • 相关阅读:
    初学微信小程序 TodoList
    设计一个基于svg的涂鸦组件(一)
    基于51单片机的12864驱动
    java 使用xom对象数据序列化为xml、反序列化、Preferences相关操作小案例
    ios UIWebView 播放优酷土豆视频
    VMware Player 使用错误集锦
    Django 使用UEditor
    Entity Framework底层操作封装V2版本号(3)
    cocos2dx笔记1:概述
    oracle10g精简版安装步骤
  • 原文地址:https://www.cnblogs.com/panini/p/6851612.html
Copyright © 2011-2022 走看看