摘要:约瑟夫问题是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个
阅读全文
摘要:【例1】切绳子。 题目描述 有N条绳子,它们的长度分别为Li。如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2位后的小数)。 输入输出格式 输入格式: 第一行两个整数N和K(0<N<=10000, 0<K<=10000),接下来N行,描述了每条绳子
阅读全文
摘要:【例1】跳石头。 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
阅读全文
摘要:二分法除了可以进行有序查找、解方程等外,还可以用来解决一些实际问题。这些问题中,非常典型的应用就是“最小化最大值问题”和“最大化最小值问题” “最小化最大值问题”和“最大化最小值问题”在优化问题中比较常见,简单来说,“最小化最大值”是为了压制优化目标中表现最突出的成分,“最大化最小值”为了提升优化目
阅读全文
摘要:二分法是一个非常高效的算法,它常常用于计算机的查找过程中。 先玩一个小游戏。预先给定一个小于100的正整数x,让你猜,猜测过程中给予大小判断的提示,问你怎样快速地猜出来? 这样猜测最快,先猜50,如果猜对了,结束;如果猜大了,往小的方向猜,再猜25;如果猜小了,往大的方向猜,再猜75;…,每猜测1次
阅读全文
摘要:【例1】大整数乘法。 编写一个程序,求两个不超过200 位的非负整数的积。 (1)编程思路。 大整数乘大整数,实质就是在小学竖式乘法的基础上枚举各个乘数位与被乘数相乘,累加到结果当中。其中乘数中的第j位与被乘数中的第i位相乘时,结果应该保存到结果的第i+j-1位中。 (2)源程序。 #include
阅读全文
摘要:一般我们称基本数据类型无法表示的整数为大整数。而对于那些精度要求很高的数据通常称为高精度数,或称大数。 表示和存放大数的一个简单的方法就是:用数组存放和表示大数。一个数组元素,存放大数中的一位。 显然,在C/C++语言中,int类型(4个字节/32位计算机)数组元素存储十进制的一位数字非常浪费空间,
阅读全文
摘要:【例1】两个大整数乘法。 输入两个不超过200位的非负大整数a和b,求a×b的值。 (1)编程思路。 用 unsigned num1[200]和num2[200]分别存放两个乘数,用result[400]来存放积。计算的中间结果也都存在result 中。result 长度取400 是因为两个200
阅读全文
摘要:C/C++中的int 类型能表示的范围是-231~231 – 1。unsigned 类型能表示的范围是 0 ~232 – 1,即 0~4294967295。所以,int 和unsigned 类型变量,都不能保存超过10 位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如要求100!的精
阅读全文
摘要:顾名思义,剪枝就是通过一些判断,剪掉搜索树上不必要的子树。在采用DFS算法搜索时,有时候我们会发现某个结点对应的子树的状态都不是我们要的结果,这时候我们没必要对这个分支进行搜索,砍掉这个子树,就是剪枝。 在DFS搜索算法中,剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。应用剪枝策略的核心问题是
阅读全文
摘要:Eight Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15
阅读全文
摘要:在采用广度优先算法进行搜索时,一个需要重点注意的是在搜索过程中判重和去重。前面介绍的几个例子中,判重都较简单,如采用vis[]数组,若vis[i]==0,则i未访问过,i入队列;若vis[i]!=0,则i已访问过,不再重复访问。 但在有些实际应用中,判重不是简单一个设置就可完成的。例如,给出一个由1
阅读全文
摘要:所谓双向广度搜索指的是搜索沿两个方向同时进行:(1)正向搜索:从初始结点向目标结点方向搜索;(2)逆向搜索:从目标结点向初始结点方向搜索;当两个方向的搜索生成同一子结点时终止此搜索过程。 广度双向搜索通常有两种方法:(1)两个方向交替扩展;(2)选择结点个数较少的那个方向先扩展。方法(2)克服了两方
阅读全文
摘要:【例1】八皇后问题。 在一个8×8国际象棋盘上,放置8个皇后,每个皇后占一格,要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的放置方法? (1)编程思路。 在八皇后问题中,由于任意两个皇后不同行,因此可以将布局表示为一维数组chess[8]。
阅读全文
摘要:在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次。例如,下图给出了骑士从坐标(1,5)出发,游历棋盘的一种可能情况。 【例1】骑士游历问题。 编写一个程序,对于给定的起始位置(x0,y0),探索出一条路径,沿着这条路径骑士能遍
阅读全文
摘要:【例1】整数变换(POJ 3278 “Catch That Cow”) 给定两个整数a和b(0 ≤a,b≤100,000),要求把a变换到b。变换规则为:(1)当前数加1;(2)当前数减1;(3)当前数加倍。 编写程序求从a到b最少需要的变换次数。 例如,从5变换到17,最少需要4歩,具体过程为:5
阅读全文
摘要:DFS(Depth First Search,深度优先搜索)和BFS(Breadth First Search,广度优先搜索)是两种典型的搜索算法。下面通过一个实例来比较一下深度优先搜索和广度优先搜索的搜索过程。 【例1】马的行走路径 设有一个n*m的棋盘(2<=n<=50,2<=m<=50),在棋
阅读全文
摘要:广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略。 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的。首先生成第一层结点,同时检查目标结点是否在所生成的结点中,如果不在,则将所有的第一层结点逐一扩展,得到第二层结点,
阅读全文
摘要:采用搜索算法解决问题时,需要构造一个表明状态特征和不同状态之间关系的数据结构,这种数据结构称为结点。不同的问题需要用不同的数据结构描述。 根据搜索问题所给定的条件,从一个结点出发,可以生成一个或多个新的结点,这个过程通常称为扩展。结点之间的关系一般可以表示成一棵树,它被称为解答树。搜索算法的搜索过程
阅读全文
摘要:1. 字母组串(2017年第8届蓝桥杯省赛试题) 由 A,B,C 这3个字母就可以组成许多串。比如:"A","AB","ABC","ABA","AACBB" .... 现在,小明正在思考一个问题:如果每个字母的个数有限定,能组成多少个已知长度的串呢? 他请好朋友来帮忙,很快得到了代码,解决方案超级简
阅读全文
摘要:阅读下列程序,写出程序执行后的输出结果。 1. #include <iostream> using namespace std; int fun(int x){ int f; if (x<=2) f=1; else f= fun(x-1)+fun(x-2); return f;}int main()
阅读全文