易码技术论坛

 找回密码
 加入易码
搜索
查看: 160659|回复: 6

【编程比赛】《小学生游戏 》

[复制链接]
发表于 2006-5-9 16:24:00 | 显示全部楼层
最多6,那就是最多3^6=700多种情况……应该挺简单的吧……

BTW, 哪里可以提交?
 楼主| 发表于 2006-5-9 16:55:00 | 显示全部楼层
直接把代码发上来就可以了。

“提交”?
发表于 2006-5-9 17:13:00 | 显示全部楼层
只用long的算法,是问原题在哪里可以提交?



  1. #include <stdio.h>

  2. long num1=1985429,num2=2006;
  3. int cnt;
  4. char flag;

  5. void exe(long x,long y,int c)
  6. {
  7. if (flag) return;
  8. if (x==y) {flag=1;cnt=c;return;}
  9. if (c>=6) return;
  10. if (x+num1<=y) exe(x+num1,y,c+1);
  11. if (x+num2<=y) exe(x+num2,y,c+1);
  12. if (x*2<=y) exe(x*2,y,c+1);
  13. return;
  14. }
  15. int main()
  16. {
  17. long a,b;
  18. while (scanf("%d%d",&a,&b)!=EOF)
  19. {
  20.   flag=0;
  21.   exe(a,b,0);
  22.   if (flag) printf("%d\n",cnt);
  23.   else printf("-1\n");
  24. }
  25. }


复制代码

 楼主| 发表于 2006-5-9 17:28:00 | 显示全部楼层
楼上的代码貌似有问题(我没装C编译工具,无法测试)。

楼上的程序求出的n不一定是满足条件最小的n。

另外现在无法提交了,比赛已经结束,学校的Online Judge 暂时没有开放。
发表于 2006-5-9 17:34:00 | 显示全部楼层
!!!

好象真是不一定是最小的。。。

哪个学校的OJ?
发表于 2006-5-9 17:37:00 | 显示全部楼层
修改了下……



  1. #include <stdio.h>

  2. long num1=1985429,num2=2006;
  3. int cnt;

  4. void exe(long x,long y,int c)
  5. {
  6. if (x==y) {if (cnt>c) cnt=c;return;}
  7. if (c>=6) return;
  8. if (x+num1<=y) exe(x+num1,y,c+1);
  9. if (x+num2<=y) exe(x+num2,y,c+1);
  10. if (x*2<=y) exe(x*2,y,c+1);
  11. return;
  12. }
  13. int main()
  14. {
  15. long a,b;
  16. while (scanf("%d%d",&a,&b)!=EOF)
  17. {
  18.   cnt=8;
  19.   exe(a,b,0);
  20.   if (cnt==8) cnt=-1;
  21.   printf("%d\n",cnt);
  22. }
  23. }


复制代码



 楼主| 发表于 2006-5-9 15:22:12 | 显示全部楼层 |阅读模式
【编程比赛】《小学生游戏 》
出两个题给大家,活跃一下板块气氛。

这些题是我们学校举行的编程大赛中的题目(已经结束),大家可以试试,把你代码贴上来,最好有注释,方便大家看。

ps:为简单起见,不需考虑题中的高精度数计算,用long 代替即可。



小学生游戏

  程序文件名: pupil.cpp/pupil.pas/...  
  某天,无聊的小杰叫上几个同学玩游戏,其中有比较笨的小凤,比较傻的小雪,可爱的小鑫和自以为是的小练。他们去找聪明的小艺去给他们当裁判。判定谁取得游戏胜利。而这个游戏是:由小艺给出一个数 a ,再给出一个数 b ,经过规定的运算,使得数 a 变换成数 b ,且使用最少的变换次数 n .谁先说对这个 n ,谁就取得胜利。当然,因为都是小学生,所以假定如果n>6 ,就算是没有答案。那么裁判小艺试图通过编程来使自己尽快的获得答案。请你帮帮他吧......

问题描述:
  题目给出数a(a是一个正整数,不超过50位),再给出目标数b(同样是一个正整数,不超过50位),
数的运算有三种:
  1:使当前数加上1985429
  2:使当前数加上2006
  3:使当前数乘2

  需要你求出这个最小的n,如果n>6,输出-1。(此为负一)。

例1:小艺给出数a=1,给出数b=1987437
  那么最快我们经过3次指定运算可以使1变成1987437
  1*2=2;(第3种变换)
  2+1985429=1985431;(第1种变换)
  1985431+2006=1987437;(第2种变换)

例2:小艺给出数a=1,给出数b=128
  那么最快我们经过7次指定运算可以使1变成128
  1*2*2*2*2*2*2*2=128(均采用第3种变换),但是因为n>6,所以按题意输出-1。




  输入 (请使用标准输入输出,而不要读写文件)

  输入仅包含两个整数A、B,每行一个数字,0<A<1e+50,0<B<1e+50。


输出 (请使用标准输入输出,而不要读写文件)

  输出只有一行,即为最少的变换次数 n ,若 n>6 则输出-1。


样例输入1样例输出11
19874373样例输入2样例输出21
128-1

参考代码:

  1. //JAVA,支持高精度数

  2. import java.util.*;
  3. import java.io.*;
  4. import java.math.BigInteger;
  5. public class Pupil{
  6. private static final int MAX_DEPTH =6;
  7. private static final BigInteger x =new BigInteger("1985429"),y =new BigInteger("2006"),z =new BigInteger("2");
  8. private static BigInteger iB;
  9. private static int        depth,min;
  10. private static void search(BigInteger a){
  11.   if(depth>=min||depth>MAX_DEPTH||a.compareTo(iB)>0) return;
  12.   if(iB.equals(a)){
  13.    min =depth;
  14.    return;
  15.   }
  16.   depth++;
  17.   search(a.add(x));
  18.   search(a.add(y));
  19.   search(a.multiply(z));
  20.   depth--;
  21. }
  22. public static int solve(BigInteger a,BigInteger b){
  23.   iB =b;
  24.   min =MAX_DEPTH+1;
  25.   depth =0;
  26.   search(a);
  27.   if(min ==MAX_DEPTH+1) return -1;
  28.   else                  return min;
  29. }
  30. public static void main(String[] args){
  31.   Scanner scan =new Scanner(System.in);
  32.   System.out.println(solve(scan.nextBigInteger(),scan.nextBigInteger()));
  33. }
  34. }
  35.   

  36.   
复制代码

  1. //GVmaker

  2. #define MAX_LEN   10
  3. #define MAX_DEP    6
  4. char numKey[]="0bnmghjtyu";
  5. long numB,min,depth;
  6. long getNum(int x,int y){
  7.      char buf[MAX_LEN+2],key;
  8.      long num,n,k;
  9.      buf[MAX_LEN+1] =0;
  10.      n =0;
  11.      while(1){
  12.         memset(buf+n,' ',MAX_LEN+1-n);
  13.         buf[n] ='_';
  14.         TextOut(x,y,buf,0x41);
  15.         key =getchar();
  16.         if(key==0x0d) break;
  17.         if(key==0x1b) exit(0);
  18.         if(key==23&&n>0) n--;
  19.         else{
  20.           for(k=0;k<10&&numKey[k]!=key;k++);
  21.           if(k>=10||n>=MAX_LEN) continue;
  22.           buf[n++]=k+'0';
  23.         }
  24.      }
  25.      num =0;
  26.      for(k=0;k<n;k++) num =num*10+buf[k]-'0';
  27.      return num;
  28. }
  29. void search(long a){
  30.      if(depth>=min||depth>MAX_DEP||a>numB) return;
  31.      if(a==numB){
  32.         min =depth;
  33.         return;
  34.      }
  35.      depth++;
  36.      search(a+1987437);
  37.      search(a+2006);
  38.      search(a<<1);
  39.      depth--;
  40. }
  41. void main(){
  42.      long numA;
  43.      while(1){
  44.           ClearScreen();
  45.           Refresh();
  46.           numA =getNum(2,2);
  47.           numB =getNum(2,16);
  48.           min  =MAX_DEP+1;
  49.           depth=0;
  50.           search(numA);
  51.           if(min==MAX_DEP+1) printf("-1\n");
  52.           else               printf("%d\n",min);
  53.           getchar();
  54.      }   
  55. }
  56.      
复制代码


[此贴子已经被作者于2006-5-10 4:05:12编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-5-13 05:31 , Processed in 0.009732 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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