灯泡排列题

来源:互联网 发布:淘宝服务商 编辑:程序博客网 时间:2024/04/28 02:55
原题出处:  点击打开链接 因为这里面还有更加有意思的题目。



此题发现过程:看别人博客,看到迷宫解法,点入后,见到了此题。当时估计了下自己的电脑和编写程序的能力,觉得大部分可能可以拿下,遂动手。

思考过程总结:这里的限制条件就是最好的帮助缩小可能性的方法。说白了是让读者在1-9里面挑四个不重样的数。概率就是:(1/9)*(1/8)*(1/7)*(1/6)

代码思路评价:用的尾递归解法。

代码瑕疵:有一处至今没有想出为何加上它之后程序反而跑不动了。前面所述问题现已解决。但依然要运行多次后 才能得到谜底:之前是运行20+次,如今运行10+次。

上面那个结果看着很干净是我运行的时候运气好。其实是程序崩溃了十次之后得到的。

附上代码:

<pre name="code" class="cpp">#include<stdio.h>  #include<stdlib.h>  #include<time.h>     struct numbers{      int apple[5];      int boy[4];      int cat[3];      int dog[2];      int egg;  };     void initializenumbers(struct numbers* good);  void calculate(struct numbers* good);     int main(){        struct numbers good;      calculate(&good);                  return 0;  }     void initializenumbers(struct numbers* good){      int b, c, d, e;             for (b = 0; b < 4; b++)              good->boy[b] = good->apple[b] + good->apple[b + 1];          for (c = 0; c < 3; c++)              good->cat[c] = good->boy[c] + good->boy[c + 1];          for (d = 0; d < 2; d++)              good->dog[d] = good->cat[d] + good->cat[d + 1];          good->egg = good->dog[0] + good->dog[1];              for (e = 0; e < 5; e++)          printf("%5d", good->apple[e]);      printf("\n");                                         }    void calculate(struct numbers* good){        int i,p;      time_t t;      srand((unsigned) time(&t));        if (good->dog[0] == good->cat[2])          return;        else {           for (i = 0; i < 4; i++){                    //Start to generate the random answer;                                            good->apple[i] = rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                     for (p=i-1; p >= 0;p--) {                              if (p == -1)                  continue;                      if(good->apple[p] == good->apple[i]) {                              good->apple[i]= rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                              p = i ;                        }                   }            }                  while (good->apple[2] != good->apple[0] + good->apple[1]){    //照理可以加快 却让程序诡异。             for (i = 0; i < 4; i++){                    //Start to generate the random answer;                                            good->apple[i] = rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                     for (p=i-1; p >= 0;p--) {                              if (p == -1)                  continue;                    if(good->apple[p] == good->apple[i]) {                           good->apple[i]= rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                  p = i ;                        }                   }            }                       }           good->apple[4]=good->apple[0];          initializenumbers(good);          calculate (good);      }  }


2014-Aug-24: 今天晚上,优化成了各个模块而且前面的思路是有错误的。其实只要小于1/9 * 1/8的概率一百次随机一般能中一次我知足了。改进后程序只要运行一次,但运行时间还是久的。附上代码:

#include<stdio.h>  #include<stdlib.h>  #include<time.h>     struct numbers{      int apple[5];      int boy[4];      int cat[3];      int dog[2];      int egg;  };  void make(struct numbers* good);   void initializenumbers(struct numbers* good);  void calculate(struct numbers* good);  int  forapplethree(struct numbers* good);   int main(){        struct numbers good;      calculate(&good);                  return 0;  }  int forapplethree(struct numbers* good){int q, flag = 0;for (q = 1; q < 10; q++){good->apple[3] = q;initializenumbers(good);if (good->dog[0] == good->cat[2]){flag = 1;break;}}return flag;}void make(struct numbers* good){    int i,p;      time_t t;      srand((unsigned) time(&t));     for (i = 0; i < 4; i++){                    //Start to generate the random answer;                                            good->apple[i] = rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                     for (p=i-1; p >= 0;p--) {                              if (p == -1)                  continue;                    if(good->apple[p] == good->apple[i]) {                           good->apple[i]= rand()%10;                  while (good->apple[i] == 0)                      good->apple[i] = rand()%10;                  p = i ;                        }                   }            }}   void initializenumbers(struct numbers* good){      int b, c, d, e;             for (b = 0; b < 4; b++)              good->boy[b] = good->apple[b] + good->apple[b + 1];          for (c = 0; c < 3; c++)              good->cat[c] = good->boy[c] + good->boy[c + 1];          for (d = 0; d < 2; d++)              good->dog[d] = good->cat[d] + good->cat[d + 1];          good->egg = good->dog[0] + good->dog[1];              for (e = 0; e < 5; e++)          printf("%5d", good->apple[e]);      printf("\n");                                         }    void calculate(struct numbers* good){          if (good->dog[0] == good->cat[2])            return;        else {  int ff = 0;          make (good);          while (good->apple[2] != good->apple[0] + good->apple[1])              make(good);            good->apple[4]=good->apple[0];            initializenumbers(good);  ff = forapplethree (good);  if (ff != 1)            calculate (good);  else return;     }  }


这次程序花了四分钟算出的。公司的电脑。GNW的编译器。

编后说说: 在未知的情况下,个人还是喜欢用随机做这个程序,在对数字不敏感的前提下,担心用for双嵌套循环时间会更久。反正也就十个数随机选两个,电脑还吃得消,多的话此方法确实不提倡,会考虑双嵌套。

 

最后还是想说,如果有高手看见请指教更加好的方法。谢谢!




0 0
原创粉丝点击