跳格子

10 篇文章 0 订阅

解题思路

这道题可以用bfs和动态规划去做。bfs就是枚举每一个位置能走的步数入队,动规就是利用上一次的最优解。下面直接看代码

代码

//动态规划解法
#include<cstdio>
#include<iostream>
using namespace std;

int a[20]={};

int main()
{
    int b[20];
    int t;//t组数据
    scanf("%d",&t);
    while(t>0)
    {
        int n,i,j;
        scanf("%d",&n);
        for(i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }

        for(i=0;i<n;++i)
        {
            b[i]=100;//因为n最大为20 最多为20步;
        }
        b[0]=0;//b[0]一定要初始化为0,第一个格子不用走
        for(i=0;i<n;++i)         //i控制当前格子
        {
            for(j=1;j<=a[i];++j) //j控制每一步跳多少个格子
            {
                b[i+j] = min(b[i+j],b[i]+1);//b[i+j]表示跳j个格子到达哪个位置,选取当前位置的步数值和一步跳j个格子走到这个位置中步数最少的那个
            }
        }

       b[n-1]==100?printf("-1\n"):printf("%d\n",b[n-1]);//b[n-1]==100说明没图跳到过终点
        t--;
    }

    return 0;
}

//bfs解法
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int a[100];
int i,j;
int n;

struct node
{
    int x,t;// x表示当前走到的那个格子的编号,t表示步数;
};

queue<node>q;

int bfs()
{
    node s;
    s.x=0;s.t=0;//初始位置
    q.push(s);//让初始位置入队
    while(!q.empty())//队列不为空,为空的话就说明每种情况列举完了
    {
        node now=q.front();//保存队首元素信息
        q.pop();           //抛出队首元素,以便下一次使用
        for(i=1;i<=a[now.x];++i) //枚举每一种走法(一次跳1格、2格...a[now.x]格)now.x表示当前站的格子的编号,而a[now.x]表示当前站的格子里面写的数
        {
            node New;  //走到一个新的位置
            New.x=now.x+i; //这个位置是通过上一个格子一步跳几个格子得到的
            New.t=now.t+1; //步数加1
            q.push(New);  //新的到的格子入队;
            if(New.x==n-1) return New.t;//如果新的到的格子已经是终点了,就可以返回结果了
        }

    }
    return -1;//没能到达终点。
}
int main()
{

    cin>>n;
    while(n--)
    {
        int m;
        cin>>m;
        for(i=0;i<m;++i)
        {
            cin>>a[i];
        }
    }
    int ans=bfs();
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值