灯泡排列题
来源:互联网 发布:淘宝服务商 编辑:程序博客网 时间: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
- 灯泡排列题
- 灯泡
- 百度笔试题-100盏灯泡的开关问题
- 【普及_模拟】开关灯泡(jzoj第三题)
- UHP 灯泡
- UHE灯泡
- 灯泡开关
- 按灯泡
- 灯泡开关
- 蓝牙灯泡
- 灯泡开关
- 意大利灯泡
- 灯泡的故事
- 投影机灯泡常识
- 开关和灯泡问题
- 百度:100个灯泡
- 灯泡,PC 与 云
- arduino蓝牙控制灯泡
- 关闭SourceInsight的大括号自动缩进
- 字符串对象(2)
- hdu 3836 Equivalent Sets hdu 2767 Proving Equivalences 强连通缩点入门
- Java并发性和多线程介绍目录
- leetcode 之 Symmetric Tree 镜像树
- 灯泡排列题
- [转]关于怎样管好一个团队
- POJ 1765 November Rain
- Light Bulb
- leetcode之Binary Tree Maximum Path Sum
- 关于memset() 函数的使用
- JQuery Lightbox 的使用方法
- JavaScript中的正则表达式
- build/envsetup.sh简记Android