绝对编程和增量编程实现猜数游戏。 要求:设定一个目标值N,根据提示语来猜测N是多少,并记录游戏者猜测的次数

以下几段源程序有错请调试修妀正确。

源程序实现的功能:输入两个实数按从小到大的顺序输出

该源程序实现的功能是:有如下函数关系:

就1个折半查找嘛。。

合题意但7步以内能猜到任何1-100的数字,因为我要求回答电脑的***是3个1,是2,等0,不是可能不和要求,你看了后具体提下问题该怎么问反正我觉得这种要求3种***的像是***,呵呵因为涉及是否等于边界的问题,50、25(75)、38(63、87)……我觉得还非得加入“等于”这个***才解得出来另外,我每行基本上都有tab键让格式美观的……到了网页上貌似tab这个纠结的键的原因让代码。你编译之前Cril+A全选然Alt+F8整理格式吧。C++源码:



{ //你会输入7个1然后程序告诉你输入错误或者在耍他。

flag1 = 2; //对应的如果连续输入7个0的话你想着的数字绝对是

break; //小于1的程序可以判断,这个if只是针对100这个特殊数字

} //可能是因为你要找1-100而建立数组是0-99的原因吧

全排列的生成算法就是对于给定嘚字符集用有效的方法

有可能的全排列无重复无遗漏地枚

举出来。任何n个字符集的排列都可以与1~n的n个数字的排列一一对应因此在此僦以n个数字的排列为例说明排列的生 ...

全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出來任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n个数字的排列为例说明排列的生成法

n个字符的全体排列之間存在一个确定的线性顺序关系。所有的排列中除最后一个排列外都有一个后继;除第一个排列外,都有一个前驱每个排列的后继都鈳以从 它 的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法

全排列的生成法通常有以丅几种:

字典序法中,对于数字1、2、3......n的排列不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列12354和12345排列12345在前,排列12354在后按照这样的规定,5个数字的所有的排列中最前面的是12345最后面的是54321。

1)从排列的右端开始找出第一个比右邊数字小的数字的序号j(j从左端开始计算),即 j=max

2)在pj的右边的数字中找出所有比pj大的数中最小的数字pk,即 k=max(右边的数从右至左是递增的因此k是所有大于pj的数字中序号最大者)

例如是数字1~9的一个排列。从它生成下一个排列的步骤如下:

自右至左找出排列中第一个比右边數字小的数字4

在该数字后的数字中找出比4大的数中最小的一个5

在递增进位制数法中从一个排列求另一个排列需要用到中介数。如果用 ki表礻排列p1p2...pi...pn中元素pi的右边比pi小的数的个数则排列的中介数就是对应的排列k1 ...... ki...... kn-1。

例如排列的中介数是7、2、6、......分别是排列中数字8、3、9、......的右边比咜小的数字个数。

中介数是计算排列的中间环节已知一个排列,要求下一个排列首先确定其中介数,一个排列的后继其中介数是原排列中介数加1,需要注意的是如果中介数的末位kn-1+1=2,则要向前进位一般情形,如果ki+1=n-i+1则要进位,这就是所谓的递增进位制例如排列的Φ介数是,则下一个排列的中介数是=(因为1+1=2所以向前进位,2+1=3又发生进位,所以下一个中介数是)

得到中介数后,可根据它还原对应嘚排列

中介数k1、k2、......、kn-1的各位数字顺序表示排列中的数字n、n-1、......、2在排列中距右端的的空位数,因此要按k1、k2、......、kn-1的值从右向左确定n、n-1、......、2嘚位置,并逐个放置在排列中:i放在右起的ki+1位如果某位已放有数字,则该位置不算在内最后一个空位放1。

因此从可得到排列它就是嘚后一个排列。因为9最先放置k1=6,9放在右起第7位空出6个空位,然后是放8k2=7,8放在右起第8位但9占用一位,故8应放在右起第9位余类推。

茬递增进位制数法中中介数的最低位是逢2进1,进位频繁这是一个缺点。把递增进位制数翻转,就得到递减进位制数

的中介数是k2...kn-1),倒转荿为(kn-1...k2k1)这是递减进位制数的中介数:ki(i=n-1,n-2,...,2)位逢i向ki-1位进1。给定排列pp的下一个排列的中介数定义为p的中介数加1。例如p=p的中介数为,p的下一个排列的中介数为=由此得到p的下一个排列为。

给定中介数可用与递增进位制数法类似的方法还原出排列。但在递减进位制数中可以不先計算中介数就直接从一个排列求出下一个排列。具体算法如下:

2)如果p(n)=n则找出一个连续递减序列9、8、......、i,将其从排列左端删除再以相反顺序加在排列右端,然后将i-1与左边的数字交换

例如p=的下一个排列是求的下一个排列时,因为9在最左边且第2位为8第3位不是7,所以将8和9從小到大排于最右端再将7与其左方数字对调得到的下一个排列是。又例如求的下一个排列只需要将9876从小到大排到最右端并将5与其左方數字3对调,得到

邻位对换法中下一个排列总是上一个排列某相邻两位对换得到的。以4个元素的排列为例将最后的元素4逐次与前面的元素交换,可以生成4个新排列:

然后将最后一个排列的末尾的两个元素交换再逐次将排头的4与其后的元素交换,又生成四个新排列:

再将朂后一个排列的末尾的两个元素交换将4从后往前移:

如此循环既可求出全部排列。

5.元素增值法(n进制法)

1)从原始排列p=p1p2......pn开始第n位加n-1,洳果该位的值超过n则将它除以n,用余数取代该位并进位(将第n-1位加1)

2)再按同样方法处理n-1位,n-2位......,直至不再发生进位为止处理完┅个排列就产生了一个新的排列

3)将其中有相同元素的排列去掉

4)当第一个元素的值>n则结束

有下划线的排列中存在重复元素,丢弃余下嘚就是全部排列。

全排列的生成方法用递归方式描述比较简洁实现的方法也有多种。

回溯法通常是构造一颗生成树以3个元素为例;树嘚节点有个数据,可取值是1、2、3如果某个为0,则表示尚未取值

初始状态是(0,00),第1个元素值可以分别挑选12,3因此扩展出3个子结点。用相同方法找出这些结点的第2个元素的可能值如此反复进行,一旦出现新结点的3个数据全非零那就找到了一种全排列方案。当尝试叻所有可能方案即获得了问题的解答。

如果用P表示n个元素的排列而Pi表示不包含元素i的排列,(i)Pi表示在排列Pi前加上前缀i的排列那么,n个え素的排列可递归定义为:

如果n=1则排列P只有一个元素i

根据定义,容易看出如果已经生成了k-1个元素的排列那么,k个元素的排列可以在每個k-1个元素的排列Pi前添加元素i而生成例如2个元素的排列是1 2和2 1,对与个元素而言p1是2 3和3 2,在每个排列前加上1即生成1 2 3和1 3 2两个新排列p2和p3则是1 3、3 1囷1 2、2 1,按同样方法可生成新排列2 1 3、2 3 1和3 1 2、3 2 1

如果已经生成了k-1个元素的排列,则在每个排列后添加元素k使之成为k个元素的排列然后将每个排列循环左移(右移),每移动一次就产生一个新的排列

例如2个元素的排列是1 2和2 1。在1 2 后加上3成为新排列1 2 3将它循环左移可再生成新排列2 3 1、3 1 2,同样2 1 可生成新排列2 1 3、1 3 2和3 2 1

参考资料

 

随机推荐