假定要在一片树林里开辟空地,树林用二维数组表示,0代表池塘或岩石等无法越过的障碍,1表示已经砍伐完成的草地,大于1的数表示树木的高度:
[ [ 1 , 2 , 3 ] , [ 0 , 0 , 4 ] , [ 7 , 6 , 5 ] ] [ [1,2,3], [0,0,4], [7,6,5] ] [[1,2,3],[0,0,4],[7,6,5]]
从 ( 0 , 0 ) (0,0) (0,0) 点出发,每次都必须砍伐可抵达的树木中最矮的那棵,需要多少步才能砍完所有树木?
要求:
1.不能越过障碍物和树木,只能越过草地;
2.如果起点有树木,直接砍倒,不计步数。
思路:每到达一个新位置,需要先确定哪些地点是目前可以抵达的,这个信息储存在 a v a i l a b l e available available 数组当中,0表示不可抵达,1表示可以抵达。随后,在可以抵达的位置中找到最矮的那棵树,然后计算通往那棵树的最短路径。
计算距离的工作由 g e t D i s t a n c e getDistance getDistance 方法完成,以当前所在位置为出发点,采用动态规划。对任何一个点来说,下一步可以抵达的点都只有上下左右四个相邻点(有障碍物的点排除在外)。然后,计算从这些点出发下一步可抵达的点距出发点的距离,以此类推,递归计算出所有可抵达位置离当前位置的距离。
代码如下:
public int cutOffTree(List<List<Integer>> forest) {
int[][] moves = new int[][]{
{
0,1},{
1,0},{
0,-1},{
-1,0}};
int treeSum = 0;