版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/seagal890/article/details/89301336
深度剖析动态规划算法求解跳跃游戏
题目描述:在一个N*N大小的棋盘中,每个格子都标有1到9当中的一个整数。游戏规则是,从棋盘的最左上角出发,最终到达最右下角。在此过程中,按照相应数值的大小可以向右或者向下移动,但是不能走出棋盘。关键在于,给定标有数值的棋盘时,判断出有没有达到终点的方法。如下如所示:
这个问题如何求解?
解法一:递归求解(采用穷举搜索法)
求解思路
从左上角起点开始搜索所有可能的走法,利用递归调用很容易实现算法。假设实现跳跃的方法为jump,则:
jump(y,x) = 返回 “从(y,x)起始能否达到终点”
每调用一次jump(),将选择从当前位置向右移动还是向下移动。假设棋盘位置(y,x)的数值是jumpSize,那么:
向下移动时能够达到终点就可以表示为jump(y+jumpSize,x);
向右移动时能够达到终点就可以表示为jump(y,x+jumpSize);
这两个结果只要有一个是true,就说明有到达终点的方法。
因此,jump()可用如下递归关系表示:
jump(y,x) = (y+jumpSize,x)|| (y,x+jumpSize)
算法设计
package com.bean.algorithm.basic;
public class JumpGame {
public static boolean jump(int x, int y, int[][] nums) {
int[][] board=nums;
if(x>=board.length || y>=board[0].length) {
//超出边界
return false;
}
if(y==board.length-1 && x==board.length-1) {
//到达终点
return true;
}
int jumpSize = board[x][y];
return jump(x+jumpSize,y,board) || jump(x,jumpSize+y,board);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] nums=new int[][] {
{2,5,1,6,1,4,1},
{6,1,1,2,2,9,3},
{7,2,3,2,1,3,1},
{1,1,3,1,7,1,2},
{4,1,2,3,4,1,2},
{3,3,1,2,3,4,1},
{1,5,2,9,4,7,1}
};
int x=0;
int y=0;
boolean flag=jump(x,y,nums);
System.out.println("flag is: "+flag);
}
}
解法二:动态规划
后续补充