这几个细节可能与效率有关(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,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?
输入
两个整数,N和K
输出
一个整数,农夫抓到牛所要花费的最小分钟数
样例输入
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
原创粉丝点击