深度剖析动态规划算法求解跳跃游戏

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
		
	}

}

解法二:动态规划

后续补充

猜你喜欢

转载自blog.csdn.net/seagal890/article/details/89301336