遍历查找跳格子逻辑

package solution;

import java.util.Scanner;
import java.util.Stack;

public class Jump {

    static boolean found=false;
    static int count=0;
    public static void main(String[] args) {

         Scanner sc=new Scanner(System.in);

         int N=sc.nextInt();

         for(int cases=1;cases<=N;cases++){

            int len=sc.nextInt();
            int s=sc.nextInt()-1;
            int f=sc.nextInt()-1;

            int steps[]=new int[len];

            for(int k=0;k<len;k++){
                steps[k]=sc.nextInt();
            }

            Stack<Integer> t=new Stack<Integer>();
            Stack<Integer> q=new Stack<Integer>();
            found=false;
            count=0;

            Jump j=new Jump();
            j.findtarget(steps, s, f, t,q);
            if(found){
                System.out.println("#"+cases+" "+(count));

                for(int i=0;i<t.size();i++){

                    // print path
                    //System.out.println(t.get(i));

                }

            }else{
                System.out.println("#"+cases+" -1");
            }

         }

         sc.close();

    }

    public void findtarget(int steps[],int s,int f,Stack<Integer> t,Stack<Integer> q){

        if(checkbound(steps,s)&&!found)
        {
            //left
            if((s>1)&&checkbound(steps,s-steps[s])&&!q.contains(s)&&!q.contains(s-steps[s])&&!found){

                t.add(s-steps[s]);
                q.add(s);
                count++;
                if(t.peek()==f){
                     found=true;
                }else{

                    findtarget(steps,t.peek(),f,t,q);
                }
            }
            else
            //right
            if((s<steps.length)&&checkbound(steps,s+steps[s])&&!q.contains(s)&&!q.contains(s+steps[s])&&!found){

                t.add(s+steps[s]);
                q.add(s);
                count++;
                if(t.peek()==f){
                    found=true;
                }else{

                    findtarget(steps,t.peek(),f,t,q);
                }
            }

        }
    }

    public static boolean checkbound(int setpn[],int p){
        boolean r=true;
        if( p>setpn.length || p<0) r=false;
        return r;
    }

}

/*
  例如 有10个 整数 1 4 2 2 4 3 6 7 10 5    从第3个数开始  可以左右跳, 第三个数对应的值是2,所以可以向左或者向右跳2个位置,
  比如向左跳2个位置,到达第1个数,   求  要到达数字6 要跳多少次? 如果没有到达最终的数字的可以打印 -1,如果有打印 次数。

给出下面5组用例,    以及每个用例包含的数字,和 开始位置  结束位置。  

5
4 2 3
1 6 1 1
4 2 3
1 2 2 2
4 2 3
1 2 2 1
10 3 6
1 4 2 2 4 3 6 7 10 5
100 1 100
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

#1 -1
#2 -1
#3 2
#4 3
#5 99

 */
时间: 2024-10-07 02:20:29

遍历查找跳格子逻辑的相关文章

遍历查找问题的应用场景

查找问题是指在一个样本范围内,是否存在需要的数据. 在学习开发的过程中,我们经常遇到该类型的问题,学习遍历-查找问题,将有助于我们快速分析问题,给出解题思维流程图. 1.查找判断问题 单纯的查找问题,是用来判断给出的数据类型里面是否存在有我们想查找的数据,而不关心这些数据是什么.在解决该类问题的时候,往往用到以下方案: 第一步:定义一个bool变量isFind,表示是否找到,由于一开始还没有开始查找,自然没有找到,所以变量isFind的值应该为false. bool isFind=false;

爪哇国新游记之二十五----图及其遍历查找

代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; // 顶点类 class Vertex{ String name;// 名称 boolean visited;// 是否已访问

DOM遍历查找结点

一.遍历API(2个) 1.深度优先原则遍历NodeIterator 节点迭代器 创建遍历API对象: var iterator=document.createNodeIterator(开始的父节点对象,whatToShow,null,false); whatToShow: NodeFilter.SHOW_ELEMENT(遍历元素节点) NodeFilter.SHOW_ALL(遍历所有) 用while循环,反复调用iterator.nextNode()方法 只要nextNode(),就向下一个移

2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 591    Accepted Submission(s): 329 Problem Description Elves are very peculiar creatures. As we all know, they can live for a very

二叉树的前序遍历建立与二叉树的前序遍历查找

#include<iostream> #include<vector> using namespace std; //二叉树的定义 struct TreeNode { char val; TreeNode *left; TreeNode *right; TreeNode(int x='#') : val(x), left(NULL), right(NULL) {} }; //建立二叉树 //AB#D##C##前序遍历 void erchashu_jianli(TreeNode**

File遍历查找

获取当前目录下的文件和子文件夹 System.out.println("-------------list()方法--------------"); File dir2=new File("d:\\"); String[] list = dir2.list(); for (String string : list) { System.out.println(string); } 获取当前目录下的pdf文件 String[] list=dir.list(new Fil

Openlayers 遍历查找交互事件(ol.interaction)

说明 有时候需要遍历openlayers的交互事件,并根据不同类型进行操作/监控. 解决方案 方法一:实现了找到交互事件中的Select事件,并删除 map.getInteractions().forEach(function (interaction) { if (interaction instanceof ol.interaction.Select) { map.removeInteraction(interaction); } }); 方法二:其实还有另一种写法,getArray()获取

两个集合遍历查找不重复

int[] tab1 = new int[]{2009,2010,2013};int[] tab2 = new int[]{2009,2010,2009,2010,2014}; //这里首先遍历表2for(int i=0; i<tab2.length; ++i) {//取出表2中的数据int elem2 = tab2[i]; boolean find = false; //这里遍历表1for(int j=0;j<tab1.length; ++j) { //取出表1中的数据int elem1 =

查找MDB中高程点的高程值有0值的图幅(用游标遍历查找某个字段的值),并将查到的结果写入到TXT中

1. mdbs = arcpy.ListWorkspaces("*","Access") 2. FeatureClasses = arcpy.ListFeatureClasses() 3. Fields = arcpy.ListFields(FeatureClass) 4. cursor = arcpy.da.SearchCursor(FeatureClass, 'ELEV') 注意:工作空间的转换 import arcpy from arcpy import en