穷举法,或称为暴力破解法(名字来源于对于密码的破译方法,即将密码进行逐个推算直到找出真正的密码为止)是程序设计中使用得最为普遍(并不是在被逼无奈时最后的狂吼)之一,它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。
用穷举算法解决问题,通常可以从两个方面进行分析:
一、问题所涉及的情况:问题所涉及的情况有哪些,情况的种数可不可以确定,候选答案的集合是一个计算机必须能够承受的。
二、答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。把这些条件描述出来。
只要把这两个方面分析好了,问题自然会迎刃而解。
只要把这两个方面分析好了,问题自然会迎刃而解。
例 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 只,母鸡...
枚举算法,也被称为穷举算法,是一种在计算机科学中广泛应用的基本解决问题的方法。它的核心理念是系统性地遍历所有可能的解决方案,直到找到符合特定条件的答案。在本例中,我们将探讨如何利用枚举算法解决一个有趣...
枚举算法是一种暴力搜索的方法,它尝试穷举问题的所有可能解,然后检查每个解是否满足问题的条件。在"百钱买百鸡"问题中,我们可以枚举公鸡、母鸡和小鸡的数量,然后计算总价,如果总价等于100,就找到了一个有效的...
穷举算法,又称全搜索或枚举法,其基本思想是通过列举所有可能的解来找到问题的正确答案。这种方法通常适用于解空间(即所有可能的解的集合)相对较小的问题。在易语言中,穷举算法可以用于解决诸如密码破解、找出...
### 使用枚举算法实现的八皇后问题源代码分析 #### 一、背景介绍 八皇后问题是一个经典的问题,在计算机科学领域被广泛用作算法设计与分析的教学案例。该问题要求在一个8×8的国际象棋棋盘上放置八个皇后,使得任意...
### 知识点:穷举算法 #### 一、穷举算法概述 穷举算法是一种基本的算法思想,它通过尝试所有可能的情况来解决问题。在密码破解或密码生成等场景中,穷举算法非常常见。本文档介绍了一个具体的穷举算法实现——密码...
穷举算法是一种常用的算法设计技巧,通过枚举所有可能的候选解,从中找出符合要求的解。穷举算法在C语言中有广泛的应用,以下是两种经典的穷举算法问题的解决方案: 一、百钱买白鸡问题 百钱买白鸡问题是中国古代...