跳格子

来源:互联网 发布:淘宝商品没有规格 编辑:程序博客网 时间:2024/04/28 21:57

解题思路

这道题可以用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;}

2 0
原创粉丝点击