博文
_getch()的用法(2006-01-10 16:36:00)
摘要:_getch()的用法
_getch():注意开头的下划线,包含头文件conio.h。_getch()有些键也是不能读入,而且,当输入箭头时回显ffffffe0,不懂为什么。#include <conio.h>#include <stdio.h>int main(){ char c; while(c = _getch()){ printf("%x\n",c); switch(c){ case 0x48: printf("UP\n"); break; case 0x4b: printf("Left\n"); break; case 0x4d: printf("Right\n");  ......
[转]称小球问题的数学证明(2006-01-09 14:51:00)
摘要:称小球问题的数学证明
[转自CSDN]由网友feng5166(枫之羽)间接提供摘自算法驿站 (rickone 的 BLOG)【问题描述】十三个球看上去一模一样,但其中一个质量不同(不知道是重了还是轻了),现在有一个天平,要求给出一种操作的方法,使得在不超过三次之内把这个球找出来(排除一切偶然情况),给出必胜策略。【推广到N个小球】有N个小球外形无区别,但是有一个在质量上与其他的球不一样。用天平称最少m次一定将不同的球找出来。显然随N增大,m不会减小。现在想解决的问题是对于任何给定的次数m,找出在该次数下能解决的最大的N值,用Nmax来表示。并给出对应于(Nmax,m)的一种解法。【关于所能解决的上限】现在来求m次所能解决的上限Nmax(m)问题。为解决这个问题,我们给出几个引理。引理一:无论加上什么其他的附加条件,只要k个球中的任一个都有可能是坏球(概率不为0),则当k>3^L时,称L次是称不出来的。这里的附加条件包括已知坏球是否重于好球,除k个未知球外还提供若干个标准球,以及k个球中某些的质量和大于另外一些的和等等,只要在这些条件下k个球中的任一个都还有可能是坏球就可以是引理所说的附加条件。证明:很显然,若k>3^L,则哪个球是坏球一共有k中情况,而称L次一共有3^L种情况,由k>3^L知不可能一定分辨出哪个球是坏球。引理二:如果另外在提供任意多个标准球(即在N个未知球外还任给标准球作"砝码"用)?br /> 则称m次最多能从N1max(m)=(3^m+1)/2个球中找出坏球来。证明:对该引理的证明可以采用数学归纳法。当m=1时,显然若只有两个球,则任挑一个与另外的标准球比较(额外提供的,不是两个中的),若相等则是剩下那一个,若不等则是这一个。所以N1max(1)>=2。而对于三个球的情况,如果第一次称用了两个或三个未知球,则无法判断出用过的球中谁是坏球(只称一次),而如果第一次称只用了一个未知球,则剩下的两个球无法区分。因此一次不能解决三个球的问题。所以N1max(1)<3。由N1max(1)<3和N1max(1)>=2知,N1max=2。设当m<=k-1时命题都成立,则考虑m=k的情况。第一次称不能使用超过3^(k-1)个未知球,否则如果坏球在这超过3^(k-1)个球中的话,由引理一......
[转]高考作文-Diablo版(2006-01-09 14:47:00)
摘要:高考作文-Diablo版
游戏背景:一个年轻人,在漫漫人生路上经历过长途跋涉,到达一个渡口的时候,他身上已经有了七个背囊:是美貌、金钱、荣誉、诚信、机敏、健康、才学。渡船开出的时候风平浪静,过了不知道多久,风起浪涌,上下颠簸,险象环生。老艄工对年轻人说:“船小,负载重,客官你必须丢掉一个背囊,才可安全到达。”看年轻人不肯丢掉任何一个,老艄工又说:“有弃有取,有失有得。”年轻人想了想,把“诚信”丢到水里。因此,有了此篇作文。 最近我狂玩Diablo 2毁灭之王,比原来的游戏新加了两个角色:刺客和战士,这样“大菠”就有了七种角色:男巫、女巫、骑士、亚马逊MM、野蛮人、战士、刺客。 上面的故事正好有七个背囊,在创建游戏角色时我制定出一个最佳配置方案:把“美貌”分给女巫,这样让她更容易迷惑敌人;把“金钱”分给骑士,好让他可以在五星级客栈里安顿要护送的妞,不必像赵匡胤送京娘一样风餐露宿有伤MM身体;把“才学”分给男巫,可以帮助他把法术练到顶级;把“诚信”分给刺客——这是中国的优良传统,看看《刺客列传》就明白了;把“机敏”给勇猛的亚马逊MM,让她们手中的箭和投枪能射中更远的敌人;把“荣誉”分战士,他一定会衣锦还乡;最后把“健康”分给野蛮人。 在这个游戏中,我只扮演野蛮人。我的人生因此非常简单,当然你也可以说成是单调。在战士眼里,一切都无所谓。除了健康,我不需要其他任何一种元素。 于是,在整个旷野里,我是一名孤独的战士,拒绝和别的玩家结成同盟,拒绝学习最基本的法术。我顶着沉重的盔甲,挥舞着血迹斑斑的锈斧在人烟罕至的荒野里默默砍杀,无数次我独自抛尸荒野,这没什么,轮回之后我依然在荒野时砍杀任何一个我遇到的人类。 最后—— 女巫被我的惊世丑陋吓疯了,她发出的闪电巧妙地击中了自己的天灵盖; 男巫的法术让我死了N+1回,最后我仅仅用斧子就生生把他劈成了两半; 骑士早已被酒色掏空了身子,很easy就一斧拦腰劈断了他以及他后面的妞; 刺客实在是太诚信了,他那些诚实的机关令我身上千疮百孔血流如注,但最后他还是没有躲过我的漫天斧影; 战士也很难对付,他召来的鬼魂重重叠叠,杀出重围之后,他依然倒在我的利斧之下; 亚马逊MM是天生战士,但我在她的眼里看到了恐惧,无可否认我当时有一点心软,甚至升起一阵兽欲。后来有传说表明我对她是先奸后杀,我懒得去解释这......
[转]怎样玩魔方(2006-01-09 14:38:00)
摘要:http://www.ahtvu.ah.cn/jxc1/zhykch/3002/wwww.files/c2.htm
怎样玩魔方(转录)
魔方曾被誉为世界三大智力玩具之一,不过现在我不敢这么说了。什么?另外两个是什么?你可记住了:那是我们中国的九连环和捉放曹啊!
魔方可以拆开。废话!不过……你拆开过吗?如果没有,赶快把魔方一块一块地卸下来,嘿嘿嘿,是不是有一种打DOOM怪物的感觉?卸下来了吗?可以看到,除了骨架上的六个不同颜色的中心积木外,还有8个角上的积木和12个棱上的积木。 中心积木只有一种颜色,棱上的积木有两种颜色,角上的积木有三种颜色。不管怎么说,没有两块积木是完全相同的。骨架上的中心积木是不能动的,所以中心积木与中心积木的相对位置是确定不变的,所以角上棱上的积木的正确位置也是不变的。例如一个红黄蓝色的角积木,它的正确位置就在红黄蓝中心积木对应面的角上。我们的任务就是把棱积木、角积木转到它们自己的位置上。
废话少说,快来观摩一下我的规划图吧:
图1
从现在起我们就要开始玩魔方了,现在的任务是完成魔方的一面。
首先选择你要玩的面颜色,在这里我选择兰色进行教学,因为我喜欢兰色^_^,我们将该颜色的中心积木所在的面称为基面。
图2
图3
图4
为了避免玩家转来转去找不到魔方的方向了,我们统一规定,魔方摆放如图2所示,另外在图3中我们要将外面的兰色块转入基面的黑色块位置时,却不能影响阴影积木,这也是玩魔方的难点。对于其他没着色的积木,都是些无关紧要的积木,可不去理会,把注意力集中在基面外面的操作块、操作块的目标位置和不可受到影响的积木上。(注:在操作的步骤中,阴影积木可以移动,但要保证步骤完毕后,阴影积木无变化)
对于魔方一面的完成,我们是一个一个操作块地完成的,饭也是一口一口地吃嘛!转时,一定要找准操作块的真正目标所在,要注意操作块的附加颜色,否则失败。如图4,黄蓝色块与绿蓝色块颠倒,所以兰色一面成功了也没有用。
下面是一些最基本的将操作块转入基面的功夫,可要认真揣摩呀!
图5
图6
简要说明:图中阴影块是目标位置,注意哟,我......
&&与||解析(2006-01-07 14:43:00)
摘要:&&逻辑与,||逻辑或,逻辑运算符,同优先级。其意义如下:A&&B——只有当A、B都为真时,该表达式值才为真;A||B——只有当A、B都为假时,表达式值才为假。 特别注意(似乎是C进行的优化):对于表达式A||B,当A为真时,将不对B进行判断,因为整个表达时的值已经确定了,为真;而对于表达式A&&B,当A为假时,将不对B进行判断,因为整个表达时的值已经确定了,为假。
看如下语句:x=y=z=-1;++x||++y&&++z;++x,值为0,x值也为0;接下来是||,还要对后面进行判断,++y,值为0,y值也为0;接下来是&&,不再进行判断,整个表达式的值为0,z的值仍为-1。故执行完后,x=0,y=0,z=-1
x=y=z=-1;++x&&++y||++z;++x,值为0,x值也为0;接下来是&&,不对紧跟表达式进行判断,y值仍为-1;接下来是||,要对后面进行判断,++z,z的值为0,整个表达式的值为0。故执行完后,x=0,y=-1,z=0看如下程序:#include <stdio.h>int main(){ int x,y,z; x=y=z=-1; ++x||++y&&++z; printf("x=%d\ty=%d\tz=%d\n",x,y,z); x=y=z=-1; ++x&&++y||++z; printf("x=%d\ty=%d\tz=%d\n",x,y,z);
return 0;}其输出结果为:x=0 y=0 z=-1x=0 y=-1 z=0......
指针本质论(2006-01-06 21:16:00)
摘要:
指针本质论
指针是一个变量,是用来存储地址的变量。这就是指针的本质。 有人可能很纳闷,指针为什么一定要定义成某类型(int, char)呢,不能就是“指针类型”吗?接触过汇编的就容易理解为什么。存储单元的单位是字节,对一个地址进行操作(读取或赋值)就要指明是对单个字节、两个字节、还是双字(四字节)。同样,指针是存储地址的,说白了,指针就是一个地址,自然也要说明了;而且,这个类型还关乎指针自加自减时真正加减的字节数。 顺便说一下,数组名也是指针,数组在申请空间时数组名存储该存储空间的首地址,注意数组名存储的是地址,因此也是指针,只是该指针一旦赋值后就不能修改,即所谓常指针。*************************** 如下函数希望为指针p申请空间,但不能达到目的,为什么呢?void GetMemory(char *p){ char *s=NULL; s= (char*)malloc(100*sizeof(char)); p=s;} 归根结底,C函数形参实参之间只是“值传递”:当形参是普通变量时,传递的是实参的值;当形参是指针时,传递的是指针变量的值,即某变量的地址,这样,可以通过指针成功的改变其所指单元的值,但自身的改变不会传回给实参。上例可改为:void GetMemory(char **p){ char *s=NULL; s= (char*)malloc(100*sizeof(char)); *p=s;}注意这样修改后,调用时实参应该是指针的“地址”(或指向指针的指针)。 见下例,Test函数可以成功修改a[0]的值,尽管形参a的值发生了变化,但不会改变实参a的值,这就说明指针形参的改变不影响指针实参的改变,但通过形参指针修改了其所对应的存储单元的值是,这改变将影响到实参。#include <iostream>using namespace std;void Test(int *a){ *(a++) = 5; //该函数真正所做的修改:将a所指存储空间的值赋为5,并将a值加1 cou......
[收藏]趣题妙答(2006-01-06 20:33:00)
摘要:原体由tiaohui发表http://www.programfan.com/club/showbbs.asp?id=135189
A,B,C,D,E,F,G,H 八人站成一排,按图所示的方法从1开始报数。问谁先报到19431005? A B C D E F G H 1——>2——>3——>4——>5——>6——>7——>8 15<—14<——13<——12<—11<——10<—9<—— ——>16——>
bruceteen的解答(超赞啊!!!)
#include using namespace std;int main( void ){ unsigned n = 19431005; n = (n-1)%14; if( n > 7 ) n = 14-n; char c = 'A'+(char)n; cout << c << endl;}答案是 C 。
FancyMouse......
[转]“公平交易”游戏(2006-01-04 21:24:00)
摘要:“公平交易”游戏
原文euc发表http://www.programfan.com/club/showbbs.asp?id=133699
现在我们玩个游戏,有三扇门,其中一个门后是100万元奖金,另两扇门后是安慰奖—山羊。游戏是这样的: 您从三扇门中任选一扇,然后euc会打开另两扇中有羊的门(euc是主持人,知道门后都有什么)。 再给您一次机会,这时只剩两扇门可以选择。您会坚持最初的选择,还是改变主意选另一扇未打开的门呢?euc这次是打开你选的门!(假定你很想获奖)......
快速排序(2006-01-04 16:47:00)
摘要:快速排序 基本思想:通过一趟排序将待排序的记录分割为独立的两部分,其中一部分记录的关键字均比另一部部分记录的关键字小,然后再分别对这两部分记录继续进行排序,已达到整个序列有序。 以趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别指向文件的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为pivotkey,则首先从high所指位置起向前搜索,找到第一个关键字小于pivotkey的记录并与枢轴记录互相交换,然后从low所指位置向后搜索,找到第一个关键字大于pivotkey的记录并与枢轴记录互相交换,重复这两步直到low=high。例:82 16 9 95 27 75 42 69 34 进行快速排序的过程注:[]表示该步交换的两记录,()表示已趟排序结束后所分割出的的两部分,||表示pivotkey原始数据:82 16 9 95 27 75 42 69 34第一趟排序:p=82[34]16 9 95 27 75 42 69 [82] 34 16 9 [82]27 75 42 69 [95] 34 16 9 [69]27 75 42 [82] 95结果为:(34 16 9 69 27 75 42)|82|(95)第二趟排序:两部分分别排序,后半部分不用再排了。前半部分p=34[27]16 9 69 [34] 75 42 |82| 9527 16 9 [34][69] 75 42 |82| 95结果为:(27 16 9)|34|(69 75 42)|82| 95第三趟排序:对第一个括号p=27[9]16[27]|34|(69 75 42)|82| 95结果:(9)|16|(27)|34|(69 75 42)|82| 95对第二个括号p=699 |16| 27 |34|[42] 75 [69] |82| 959 |16| 27 |34| 42 [69][75] |82| 95结果:9 |16| 27 |34| (42)|69|(75)|82| 95最终结果为:9 |16| 27 |34| 42 |69| 75 |82| 95......
[收藏]金币真伪(2006-01-04 15:54:00)
摘要:金币真伪
原题由guan628429发表http://www.programfan.com/club/showbbs.asp?id=134804
有8个金币(如A,B,C.......)其中一个是假的,外观无法辨认,但假币或轻或重,现用一个天平为工具,请用最少的步骤找出假的来,并说明比真的或轻或重
*********************************************
鄙人答案:3次
8个金币分别编号为12345678。
第一次135与246比较,第二次127与348比较,第三次有问题的其中之一与标准的比较。
对比较结果解释如下:
(1)第一次比较,若135与246相等,则说明123456是好的,78其中之一有问题。第二次比较,127与348必不相等,若127重则说明7重或8轻,若348重则说明7轻或8重。得到78之一有问题。
(2)第一次比较,若135重,则说明78无问题。第二次比较,若127与348相等,则说明56之一问题:5重或6轻;若127重,则说明14之一有问题:1重或4轻;若348重,则说明23有问题:3重或2轻。
(3)第一次比较,若246重,则说明78无问题。第二次比较,若127与348相等,则说明56之一问题:6重或5轻;若127重,则说明14之一有问题:4重或1轻;若348重,则说明23有问题:2重或3轻。
第三次取相应有问题的两个之一与标准1~6之一比较即可。
……好晕哪!
......
