穷举法,或称为暴力破解法(名字来源于对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止)是程序设计中使用得最为普遍(并不是在被逼无奈时最后的狂吼)之一,它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。
用穷举算法解决问题,通常可以从两个方面进行分析:
一、问题所涉及的情况:问题所涉及的情况有哪些,情况的种数可不可以确定,候选答案的集合是一个计算机必须能够承受的。
二、答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。把这些条件描述出来。
只要把这两个方面分析好了,问题自然会迎刃而解。
只要把这两个方面分析好了,问题自然会迎刃而解。
例 1 :
36 块砖, 36 人搬。男搬 4 ,女搬 3 ,两个小儿抬一砖。要求一次全搬完。问需男、女、小儿各若干?
分析 :
题目要我们找出符合条件的男生、女生和小孩的人数。答案显然是一组数据。首先分析一下问题所涉及的情况。
对于男生来说,至少要有一人;每个男生可以搬4块砖,那么36块砖最多9个男生足够,共有9种不同取值。同样,女生有12种不同取值。两个小孩抬一块砖,至少要有两个小孩,最多36个,并且小孩的人数必须是个偶数,所以小孩的人数可以取18种不同的值。
最坏情况下,男生、女生和小孩的人数可以是 9 × 12 × 18 = 1944 种不同组合。
知道了问题所涉及的情况有1944种,是个确定的数。接下来就要把它描述出来。
假设男生人数为 x ,女生人数为 y ,小孩人数为 z 。可以构建一个三重循环, x 、 y 、 z 的值必须要同时满足两个条件:
①总的工作量是 36 块砖,即: 4x+3y+z/2=36 ;
②需要的总人数是 36 人,即: x+y+z=36 。
把它描述出来就是: 4x+3y+z/2=36 and x+y+z=36 。
满足这个条件的 x 、 y 、 z 的值就是问题的答案。我们可以在循环体里面对这个条件进行判断,源程序如下:
public class Meiju{
public static void main(String[] args){
for(int x=1;i<=9;i++)
for(int y=1;i<=12;i++)
for(int z=2;z<=36;i+=2)
if((4*x+3*y+z/2==36)&&(x+y+z==36)
System.out.println("男生="+x+" 女生="+y+" 小孩="+z);
}
}
运行:
男生=3 女生=3 小孩=30
例2:
下面是一个填写数字的模板,其中每个字都代表数字中的”0~9“,那么要求我们输入的数字能够满足此模板。
思路:首先拿到这个题,蛋还是比较疼的,因为找不到好的解题思路,最后只好"暴力"了
public class MeijuTest {
public static void main(String args[]) {
String father = null;
String mother = null;
String son = null;
int[] a = { 111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999 };
int[] b = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
father = a[i] / b[j] + "";
mother = b[j] + "";
son = a[i] + "";
if ((father.charAt(0) == mother.charAt(0)) && (father.charAt(4) == son.charAt(0)) && (father.length() == 5)) {
System.out.println(" " + father);
System.out.println("X " + mother);
System.out.println("-------");
System.out.println(son);
System.out.println();
System.out.println("费了:" + ((i + 1 - 1) * 9 + (j + 1)) + "次,TMD终于找出来了!");
}
}
}
}
}
运行结果:
79365
X 7
-------
555555
费了:43次,TMD终于找出来了!
下载源码。
- 大小: 3.5 KB
分享到:
相关推荐
在这个“数据结构与算法_1.4 枚举(穷举)算法 (2)”的主题中,我们将深入探讨枚举算法的应用、原理及其在实际编程中的实现。 枚举算法的基本思想是系统性地列出所有可能的候选解,然后逐一验证每个候选解是否满足...
枚举算法,顾名思义,是一种通过列举所有可能的选项,逐一排查以寻找问题的解决方案的算法。在计算机科学领域,枚举算法是一种基础且应用广泛的解决问题的方法。它通过穷举所有可能的情况,直到找到满足条件的答案。...
数据结构与算法_枚举(穷举)算法(视频),Dev-C++语言环境!信息学奥赛基础算法!
枚举算法,或称穷举算法,是一种常见的解决问题的方法,尤其在面对有限且可数的解决方案时。在这个"算法系列"中,我们将深入探讨枚举算法的概念、应用场景以及如何在实际编程中实施。 枚举算法的基本思想是对所有...
MATLAB优化算法案例分析与应用(进阶篇)1-10章程序下载
枚举算法作为算法设计与分析中的一个基本方法,广泛应用于各类问题求解。它的核心思想是通过对问题所有可能解的穷举和逐一验证,确保能够找到满足条件的正确答案。因其解的准确性和全面性,以及相对简单的实现方式,...
在教学设计中,首先应当引导学生理解枚举算法的核心思想——即通过穷举所有可能的情况来寻找满足特定条件的解。枚举算法的重难点在于如何确定枚举的范围以及验证条件。对于初学者来说,问题的边界界定和验证条件的...
枚举算法,亦称为暴力搜索算法,是一种穷举搜索法,通过遍历所有可能的解空间来找到问题的解。它不依赖于问题的特定结构,而是简单地通过比较和筛选来获得结果。在面对问题的解空间不大,或者问题没有明显的规律和...
同时,在面对需要穷举可能性的问题时,枚举算法提供了一种有效且可靠的解决方案。通过实例分析和编程实践,学生不仅能够掌握枚举算法的原理和步骤,还能体会到算法在解决实际问题中的作用和价值。 总而言之,枚举...
穷举算法,又称全搜索或枚举法,其基本思想是通过列举所有可能的解来找到问题的正确答案。这种方法通常适用于解空间(即所有可能的解的集合)相对较小的问题。在易语言中,穷举算法可以用于解决诸如密码破解、找出...
枚举算法,通常被称为穷举法,是计算机高级语言中核心算法之一。它通过对可能集合的所有元素进行列举,配合已知条件,判断每一个元素是否有效,即是否符合问题的解法。这种方法在处理特定问题,如“百钱百鸡”、“求...
穷举算法是一种基于枚举所有可能解决方案的方法,以找到最佳解。在TSP中,这意味着尝试所有可能的路线组合,计算每种组合的总距离,然后选择最短的路线。然而,随着城市数量的增加,可能的路线组合呈指数增长,使得...
我几乎找遍了网络上差不多所有的穷举算法,都不是很满意。然后自己研究了差不多一下行的时候,把现在的代码进行了注释和部分优化。 这个穷举算法,可以自定义起始位,终止位,还可以自定义密码字符。差不多是我觉得...
c语言描述的推销员问题的穷举算法。含程序运行时间计算函数。已经经过测试。
这些问题都可以通过穷举算法来解决,具体实现方法是通过循环语句来枚举所有可能的情况,并根据条件来筛选出符合要求的解。 百鸡问题是一个经典的穷举算法问题,问题是用 100 元买 100 只鸡,大公鸡 5 元 1 只,母鸡...
枚举算法,也被称为穷举算法,是一种在计算机科学中广泛应用的基本解决问题的方法。它的核心理念是系统性地遍历所有可能的解决方案,直到找到符合特定条件的答案。在本例中,我们将探讨如何利用枚举算法解决一个有趣...
枚举算法是一种通过穷举所有可能的解来找到问题的解决方案的方法。在问题的解空间不大,且可以通过简单规则来判断解的有效性时,枚举算法是十分有效的。然而,当解空间急剧增加时,枚举算法可能会因为需要处理的解的...
枚举法通常被视为一种“蛮力”方法,因为它通过穷举所有可能性来解决问题。相比之下,搜索算法(如深度优先搜索、广度优先搜索等)通过智能地探索解空间,可以在更短的时间内找到解,尤其是在解空间庞大且结构化的...