我跳我跳我跳跳跳
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
有一条直线,上有n个点,编号从0到n-1。当小A站在s点处,每次可以往前跳到s+1,也可以往前跳到s-1(当s-1 >= 0时),也可以调到2*s处。现在问小A最少跳多少次才能跳到点e处。
输入
多组输入。每组输入两个整数s,e(0 <= s,e <= 100,000)。n趋于无穷大。
输出
输出小A从s跳到e的最小次数。
示例输入
5 17
示例输出
4
#include <stdio.h> #include <string.h> #define N 400001 void bfs (int a,int b); struct node { int x,c;//x表示数据,c表示计数器 } p[N]; int mv[N],i; int jx[]= {1,0,-1};// int main () { int a,b; while (scanf ("%d%d",&a,&b)!=EOF) { memset (mv,0,sizeof (mv)); bfs(a,b); } return 0; } void bfs (int a,int b) { int s=0,e=0; struct node t,f;//临时结构体 t.x=a; t.c=0; p[e++]=t;//进队 mv[t.x]=1; while (s<e)//队列为空时跳出 { t=p[s++];//出队 if (t.x==b)//找到数据,输出 { printf ("%d\n",t.c); return ; } for (i=0; i<3; i++) { if (i==1) { f.x=t.x*2; } else { f.x=t.x+jx[i]; } if (f.x>=0 && f.x <N && mv[f.x]==0)//保证在范围内&&没有走过 { f.c=t.c+1;//计数器+1 p[e++]=f; mv[f.x]=1;//走过记录为1 } } } return ; }