这几个细节可能与效率有关(1)
来源:互联网 发布:商业数据保密协议范本 编辑:程序博客网 时间:2024/06/05 15:47
1.广搜标记已经访问的路径 2. 使用c++语言提供的工具,不自己创建工具。
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
5 17
4
解法1:暴力广搜,只能解出小步骤能到达的,因为第n步骤为3^n,到第n+1步骤又为 3^n -1+ 3….(不标记曾经走过的路线)
#include<cstdio>#include<cstring>using namespace std;struct info{int tt;int x;};struct cisqque{struct info data[40000];int front;int rear;};void quepush(cisqque &qu,struct info x){qu.data[++qu.rear%40000]=x;qu.rear%=40000;++qu.data[qu.rear].tt;}bool queempty(cisqque qu){return qu.rear==qu.front;}struct info quepop(cisqque &qu){struct info temp=qu.data[++qu.front%40000];qu.front%=40000;return temp;}int main(){cisqque qu;int x1,x2; scanf("%d%d",&x1,&x2);qu.front=qu.rear=0; memset(qu.data,0,sizeof(qu.data));struct info xx; xx.x=x1; quepush(qu,xx); qu.data[qu.rear].tt=0;while(!queempty(qu)){xx=quepop(qu);if(xx.x==x2){printf("%d",xx.tt); return 0;}xx.x-=1; if(xx.x>=0) quepush(qu,xx);xx.x+=2; if(xx.x<=100000) quepush(qu,xx);xx.x-=1; xx.x*=2; if(xx.x<=100000) quepush(qu,xx);}}
解法二:使用容器,不自己定义函数,在结果超过10以上是最快的
#include<cstdio> #include<queue>using namespace std;int ans[100002]={0};bool f[100002]={0}; //f可以用ans代替int n,k;queue<int> q;void bfs(int x){ ans[x]=0; f[x]=1; q.push(x); while(!q.empty()){ int z=q.front(); q.pop(); if(!f[z+1]&&z+1<=100000){ f[z+1]=1; q.push(z+1); ans[z+1]=ans[z]+1; } if(!f[z-1]&&z-1>=0){ f[z-1]=1; q.push(z-1); ans[z-1]=ans[z]+1; } if(!f[z*2]&&z*2<=100000){ f[z*2]=1; q.push(z*2); ans[z*2]=ans[z]+1; } if(ans[k]){ printf("%d",ans[k]); return; } }}int main(){ scanf("%d%d",&n,&k); if(n==k){ printf("0\n"); return 0; } bfs(n);}
3.
-=-= 结果在10以上时,比第二种慢得多
-=-= 结果在10以上时,比第二种慢得多#include<cstdio>#include<cstring>using namespace std;struct info{int tt;int x;};struct cisqque{struct info data[40000];int front;int rear;};void quepush(cisqque &qu,struct info x){qu.data[++qu.rear%40000]=x;qu.rear%=40000;++qu.data[qu.rear].tt;}bool queempty(cisqque qu){return qu.rear==qu.front;}struct info quepop(cisqque &qu){struct info temp=qu.data[++qu.front%40000];qu.front%=40000;return temp;}int main(){cisqque qu;int x1,x2; scanf("%d%d",&x1,&x2); bool vis[100010]={false};qu.front=qu.rear=0; memset(qu.data,0,sizeof(qu.data));//qu用全局变量,那么就不用cstring函数struct info xx; xx.x=x1; quepush(qu,xx); qu.data[qu.rear].tt=0;while(!queempty(qu)){xx=quepop(qu);if(xx.x==x2){printf("%d",xx.tt); return 0;}xx.x-=1; if(xx.x>=0&&!vis[xx.x]){quepush(qu,xx); vis[xx.x]=1;}xx.x+=2; if(xx.x<=100000&&!vis[xx.x]){quepush(qu,xx); vis[xx.x]=1;}xx.x-=1; xx.x*=2; if(xx.x<=100000&&!vis[xx.x]){quepush(qu,xx); vis[xx.x]=1;}}}
0 0
- 这几个细节可能与效率有关
- 这几个细节可能与效率有关(1)
- 有关ubuntu实用工具系列的几个细节
- Build 2016,你可能忽视的几个细节
- 有关Motorola J2ME开发的几个细节问题
- 有关motorola j2me开发的几个细节问题
- 有关motorola j2me开发的几个细节问题
- 有关motorola j2me开发的几个细节问题
- 有关Motorola J2ME开发的几个细节问题
- 有关NSMutableSet与NSMutableArray的一些细节
- 有关效率
- 介绍几个与Jabber有关的项目
- 与二分分治有关的几个函数
- 与构架有关的几个基本概念
- 与variant有关的几个FUNCTION
- 与性能优化有关的几个程序
- 与Delta有关的几个表
- 与邮件传输有关的几个协议
- HTML meta viewport属性说明(mark)
- LLVM学习笔记(9)
- 利用JasperReport+iReport进行Web报表开发(java)
- 文字旋转的几种方法
- 通过pci-sysfs来查询当前设备支持的最多几个vf
- 这几个细节可能与效率有关(1)
- poj 2488 A Knight's Journey 【骑士周游 dfs + 记忆路径】
- 关于用折半查找来定位目标值的区间
- java notify notifyall 区别
- throw er; // Unhandled 'error' event
- 关键字this的用法及作用
- (三)android recovery差分升级过程掉电分析
- CodeForces 609 D.Gadgets for dollars and pounds(二分+贪心)
- 浅谈数据分析软件该怎么选