跳格子
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; }
相关文章推荐
- 浅谈持久层框架中的缓存机制
- i++与++i的区别与性能差异
- 201603233第八章时间与第九章成本
- 2016年3月28日 第一次接触workerman-1
- 单链表(C语言)基本操作
- 如何带新近的程序员
- STL与泛型编程<十一>:Insert(安插)迭代器
- spring和hibernate整合使用getCurrentSession方法
- cron表达式详解
- 推送
- 文件的打开和关闭
- 【转】 java web开发之安全事项
- hdu 5637 Transform 最短路
- TCP面试题(一)之TCP的三次握手和accept()的顺序
- 可能导致Loadrunner检查点中savecount为0的分析
- java设计模式之工厂模式
- linux课程笔记--基础部分
- mysql查看表结构的几种方式
- GLUT文档
- C++实验2-项目1标准体重