袋鼠跳河问题——回溯法解决
问题描述:
一只袋鼠要从河这边跳到河对岸,河很宽
但是河中间打了很多桩子,每隔一米就有一个,
每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。
每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,
就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。
河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,
给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1
输入描述:
输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出描述:
输出最少的跳数,无法到达输出-1
输入:
5
2 0 1 1 1
输出:
4
思路介绍:
其实这个题也是一个回溯法的题,其实说白了就是回溯法适用于就是先走一步然后看下一步的,然后如果下一步可以走的通的话,就继续往下面走,如果走不通的话就退回来继续执行
对于本题而言,我可以先建立一个一维的数组array[ ]用来存放每个弹簧的弹力,
就随便举个例子把,输入的五个数是2、1、2、1、1
2 | 1 | 2 | 1 | 1 |
---|
所以接下来我们就要开始从array下标为0开始用回溯法求解了,首先你看array[0]=2,说明他可以跳一个或者两格,所以接下来就要用先跳一格来尝试了,之后紧接着再跳一格,此时发现弹簧的弹力是2,所以可以跳一格或者是两格,先尝试跳一格的,此时i=3了,此时因为array[3]=1,所以只能跳一格,然后array[4]=1,之后就是在跳一格然后就结束了,我首先画一下这一种的大致情况发展
,
2 | 1 | 2 | 1 | 1 |
---|---|---|---|---|
↑ | - | - | - | - |
2 | 1 | 2 | 1 | 1 |
---|---|---|---|---|
- | ↑ | - | - | - |
2 | 1 | 2 | 1 | 1 |
---|---|---|---|---|
- | - | ↑ | - | - |
2 | 1 | 2 | 1 | 1 |
---|---|---|---|---|
- | - | - | ↑ | - |
2 | 1 | 2 | 1 | 1 |
---|---|---|---|---|
- | - | - | - | ↑ |
2 | 1 | 2 | 1 | 1 | |
---|---|---|---|---|---|
- | - | - | - | - | ↑ |
这是第一种情况,之后的情况就不讨论了,用回溯法就可以解决了…
代码分析:
import java.util.Scanner;
public class Main {static int number;static String str="";public static void main(String[] args) {Scanner m=new Scanner(System.in);int n=m.nextInt();number=n;int array[]=new int[n];for(int i=0;i<array.length;i++)array[i]=m.nextInt();int temp=0;operate(0,array,temp);printf(str);}public static void printf(String str2) {if(str.equals(""))System.out.println(-1);else{String ss[]=str.split(" ");int nn[]=new int[ss.length];for(int i=0;i<ss.length;i++)nn[i]=Integer.parseInt(ss[i]);int min=nn[0];for(int k=0;k<nn.length;k++)if(min>nn[k])min=nn[k];System.out.println(min);}}public static void operate(int i, int[] array,int temp) {if(i>=number){System.out.println(temp);str+=temp+" ";return ;}else if(i<number){int ss=array[i];temp++;for(int k=0;k<=ss;k++){array[i]=k;if(panduan(array[i])){operate(array[i]+i,array,temp);}}}}public static boolean panduan(int i) {if(i==0)return false;elsereturn true;}
}
袋鼠跳河问题——回溯法解决相关推荐
- c语言 用回溯算法解决01背包问题,回溯法解决01背包问题
<回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...
- 回溯法解决全排列问题总结
1.了解全排列和回溯 所谓全排列就是从n个元素中取出n个元素按照一定的顺序进行排列,所有的排列情况叫做全排列. 这n个元素又分为两种情况,一种是n个元素存在重复元素,一种是n个元素不存在重复元素.不存 ...
- 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)
问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...
- 利用回溯法解决1-9之间添加+或-或使得运算结果为100的问题
问题描述 编写一个在1,2,-,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性.例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 1 ...
- 回溯法解决0-1背包问题
回溯法解决0-1背包问题 参考文章: (1)回溯法解决0-1背包问题 (2)https://www.cnblogs.com/womendouyiyang/p/10957527.html (3)http ...
- 编程解决素数环问题Java_回溯法解决素数环问题java实现
素数环问题: 输入正整数n,把整数1,2,3--,n组成一个环,使得相邻两个整数之和均为素数,输出所有方案,注意同一个环应恰好输出一次.n<==16 样例输入: 6 样例输出: 1 4 3 2 ...
- 回溯法解决部落冲突问题
回溯法解决部落冲突问题 实验内容 问题描述 思路分析 方法步骤 实验代码 实验内容 原始部落byteland中的居民为了争抢有限的资源,经常发生冲突.几乎每个居民都有它的仇敌.部落酋长为了组织一支保卫 ...
- 回溯法解决n皇后问题
回溯法解决n皇后问题 题目要求: 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后, ...
- 回溯法解决力扣79题单词搜索
回溯法解决力扣79题单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母 ...
最新文章
- 深入探讨下Linux下修改hostname的五个问题(四)
- 漫谈面向对象基石之开闭原则(OCP)(转)
- labview数据枚举数据服务器,枚举器报告'未指定的错误,不能枚举服务器
- 人体工学腰垫,保腰神器,改善久坐腰酸背痛
- ListView常用属性、方法
- 牛客网暑期ACM多校训练营(第十场)D Rikka with Prefix Sum (组合数学)
- 小试牛刀:文本处理工具之grep、egrep详解
- (转)基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用...
- android studio怎么设置log保存txt_【Stata写论文】log命令的使用和分析结果导出
- 产品经理的方向感-产品生命周期
- Java窗口之文本框、按钮、菜单
- 论文排版一步搞定之公式——(公式居中,编号居右)
- HBase 过滤器使用
- 自学三个月编写简单走迷宫游戏
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR...
- PHP windoews调用OpenOffice实现word/ppt转PDF-附带demo
- SQLserver技巧 年份判断,以及向上想下取整
- 2.JVM垃圾回收机制-什么时候回收内存
- 网页图片加载优化方法总结
- 格式化什么意思?格式化了数据还能恢复吗?