鱼C论坛

 找回密码
 立即注册
查看: 2413|回复: 1

bug求助 为什么这个代码输入超过20就错。。

[复制链接]
发表于 2020-10-24 21:13:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么这个代码输入超过20就错。。
给定两个正整数m、n,问只能做加1、乘2和平方这三种变化,从m变化到n最少需要几次


输入:


输入两个10000以内的正整数m和n,且m小于n


输出:


输出从m变化到n的最少次数


输入样例:

1 16




输出样例:

3



  1. #include <stdio.h>
  2. void init(void);
  3. void clean(void);
  4. void addtoqueue(int);
  5. int takeoutofqueue(void);
  6. int emptyqueue(void);
  7. int canmoveto(int pre,int *curr,int i);
  8. int isaim(int);
  9. int used(int);
  10. void readdata(void);
  11. int search(void);

  12. int head,tail;
  13. int a[1000];
  14. int queue[1000],qlen=1000;
  15. int s,t;
  16. int xtmp,x[100];

  17. int main(void)
  18. {
  19.         int i,n1;
  20.         clean();
  21.         readdata();
  22.         xtmp=search();
  23.         printf("%d\n",xtmp);
  24.         return 0;
  25. }

  26. void init(void)
  27. {
  28.         head=0;
  29.         tail=1;
  30.         queue[0]=s;
  31. }
  32. void clean(void)
  33. {
  34.         int i;
  35.         for(i=0;i<10000;i++)
  36.         {
  37.                 a[i]=0;
  38.         }
  39.         for(i=0;i<qlen;i++)
  40.         {
  41.                 queue[i]=0;
  42.         }
  43. }
  44. void addtoqueue(int curr)
  45. {
  46.         queue[tail++]=curr;
  47.         tail=tail%qlen;
  48. }
  49. int takeoutofqueue(void)
  50. {
  51.         int curr;
  52.         curr=queue[head++];
  53.         head=head%qlen;
  54.         return curr;
  55. }
  56. int emptyqueue(void)
  57. {
  58.         if(head==tail)return 1;
  59.         return 0;
  60. }
  61. int canmoveto(int pre,int*curr,int i)
  62. {
  63.         int p;
  64.         p=pre;
  65.        
  66.         switch(i)
  67.         {
  68.                 case 0:p+=1;break;
  69.                 case 1:p*=2;break;
  70.                 case 2:p=p*p;break;
  71.         }
  72.         *curr=p;
  73.         return 1;
  74. }
  75. int isaim(int curr)
  76. {
  77.         if(curr==t)return 1;
  78.         return 0;
  79. }
  80. int used(int curr)
  81. {
  82.         if(a[curr]!=0)return 1;
  83.         return 0;
  84. }
  85. void readdata(void)
  86. {
  87.         scanf("%d %d",&s,&t);
  88. }
  89. int search(void)
  90. {
  91.         int pre,curr,i,num;
  92.         init();
  93.         while(!emptyqueue())
  94.         {
  95.                 pre=takeoutofqueue();
  96.                 num=a[pre];
  97.                 printf("num_%d\n",num);
  98.                 for(i=0;i<3;i++)
  99.                 {
  100.                         if(canmoveto(pre,&curr,i))///////
  101.                         {
  102.                                 if(isaim(curr))return num+1;
  103.                                 if(!used(curr))
  104.                                 {
  105.                                         a[curr]=num+1;
  106.                                         addtoqueue(curr);
  107.                                 }
  108.                         }
  109.                 }
  110.         }
  111.         return 0;
  112. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-25 09:21:41 | 显示全部楼层
破案了破案了,要剪枝的,大几百的平方会溢出,半句话的事
  1. #include <stdio.h>
  2. void init(void);
  3. void clean(void);
  4. void addtoqueue(int);
  5. int takeoutofqueue(void);
  6. int emptyqueue(void);
  7. int canmoveto(int pre,int *curr,int i);
  8. int isaim(int);
  9. int used(int);
  10. void readdata(void);
  11. int search(void);

  12. int head,tail;
  13. int a[10000];
  14. int queue[10000],qlen=10000;
  15. int s,t;
  16. int x;

  17. int main(void)
  18. {
  19.         readdata();
  20.         x=search();
  21.         printf("%d\n",x);
  22.         return 0;
  23. }

  24. void init(void)
  25. {
  26.         head=0;
  27.         tail=1;
  28.         queue[0]=s;
  29. }
  30. void clean(void)
  31. {
  32.         int i;
  33.         for(i=0;i<10000;i++)
  34.         {
  35.                 a[i]=0;
  36.         }
  37.         for(i=0;i<qlen;i++)
  38.         {
  39.                 queue[i]=0;
  40.         }
  41. }
  42. void addtoqueue(int curr)
  43. {
  44.         queue[tail++]=curr;
  45.         tail=tail%qlen;
  46. }
  47. int takeoutofqueue(void)
  48. {
  49.         int curr;
  50.         curr=queue[head++];
  51.         head=head%qlen;
  52.         return curr;
  53. }
  54. int emptyqueue(void)
  55. {
  56.         if(head==tail)return 1;
  57.         return 0;
  58. }
  59. int canmoveto(int pre,int*curr,int i)
  60. {
  61.         int p;
  62.         p=pre;
  63.        
  64.         switch(i)
  65.         {
  66.                 case 0:p+=1;break;
  67.                 case 1:p*=2;break;
  68.                 case 2:p=p*p;break;
  69.         }
  70.         if(p<=t)*curr=p;
  71.         return 1;
  72. }
  73. int isaim(int curr)
  74. {
  75.         if(curr==t)return 1;
  76.         return 0;
  77. }
  78. int used(int curr)
  79. {
  80.         if(a[curr]!=0)return 1;//<------------------------论剪枝的重要性。草泥马
  81.         return 0;
  82. }
  83. void readdata(void)
  84. {
  85.         scanf("%d %d",&s,&t);
  86. }
  87. int search(void)
  88. {
  89.         int pre,curr,i,num;
  90.         init();
  91.         while(!emptyqueue())
  92.         {
  93.                 pre=takeoutofqueue();
  94.                 num=a[pre];
  95.                 for(i=0;i<3;i++)
  96.                 {
  97.                         if(canmoveto(pre,&curr,i))///////
  98.                         {
  99.                                 if(isaim(curr))return num+1;
  100.                                 if(!used(curr))
  101.                                 {
  102.                                         a[curr]=num+1;
  103.                                         addtoqueue(curr);
  104.                                 }
  105.                         }
  106.                 }
  107.         }
  108.         return 0;
  109. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表