您的位置:首页 > 其它

跳格子

2016-03-28 20:35 260 查看




解题思路

这道题可以用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: