马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
|