|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
为什么这个代码输入超过20就错。。
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次
输入:
输入两个10000以内的正整数m和n,且m小于n
输出:
输出从m变化到n的最少次数
输入样例:
1 16
输出样例:
3
- #include <stdio.h>
- void init(void);
- void clean(void);
- void addtoqueue(int);
- int takeoutofqueue(void);
- int emptyqueue(void);
- int canmoveto(int pre,int *curr,int i);
- int isaim(int);
- int used(int);
- void readdata(void);
- int search(void);
- int head,tail;
- int a[1000];
- int queue[1000],qlen=1000;
- int s,t;
- int xtmp,x[100];
- int main(void)
- {
- int i,n1;
- clean();
- readdata();
- xtmp=search();
- printf("%d\n",xtmp);
- return 0;
- }
- void init(void)
- {
- head=0;
- tail=1;
- queue[0]=s;
- }
- void clean(void)
- {
- int i;
- for(i=0;i<10000;i++)
- {
- a[i]=0;
- }
- for(i=0;i<qlen;i++)
- {
- queue[i]=0;
- }
- }
- void addtoqueue(int curr)
- {
- queue[tail++]=curr;
- tail=tail%qlen;
- }
- int takeoutofqueue(void)
- {
- int curr;
- curr=queue[head++];
- head=head%qlen;
- return curr;
- }
- int emptyqueue(void)
- {
- if(head==tail)return 1;
- return 0;
- }
- int canmoveto(int pre,int*curr,int i)
- {
- int p;
- p=pre;
-
- switch(i)
- {
- case 0:p+=1;break;
- case 1:p*=2;break;
- case 2:p=p*p;break;
- }
- *curr=p;
- return 1;
- }
- int isaim(int curr)
- {
- if(curr==t)return 1;
- return 0;
- }
- int used(int curr)
- {
- if(a[curr]!=0)return 1;
- return 0;
- }
- void readdata(void)
- {
- scanf("%d %d",&s,&t);
- }
- int search(void)
- {
- int pre,curr,i,num;
- init();
- while(!emptyqueue())
- {
- pre=takeoutofqueue();
- num=a[pre];
- printf("num_%d\n",num);
- for(i=0;i<3;i++)
- {
- if(canmoveto(pre,&curr,i))///////
- {
- if(isaim(curr))return num+1;
- if(!used(curr))
- {
- a[curr]=num+1;
- addtoqueue(curr);
- }
- }
- }
- }
- return 0;
- }
复制代码 |
|