第1讲暴力破解法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1讲 暴力破解法
蓝桥杯常见算法
枚举法(暴力破解法) 分治法 回溯法 动态规划法
枚举法(暴力破解法)
在进行归纳推理时,如果逐个考察了某类事情的所有可 能情况,因而得出一般结论,那么这结果是可靠的,这 种方法叫做枚举法。
从这里可以看出枚举法要将问题的所有可能的答案一一 列举,然后根据条件判断此答案是否合适,合适就保留, 不合适就丢弃。
已知只有一个主谋,三个人说的是真话,一个人 说的是假话。现在要根据这些信息,找出真正的 主谋。
所谓枚举,也就是将问题的所有可能的答 案一一列举,那么在本例当中,A、B、C 、D四个人,只有一位是主谋。那么本例 的解无非就是以下4种情况:
①A是主谋 ②B是主谋 ③C是主谋 ④D 是主谋
列出这所有4种情况后,我们再对这4种情 况进行一一验证。
if(sum==3) System.out.println(head);
public static void main(String[] args) { char head;int k,sum; char[] person={' ','A','B','C','D'}; for(k=1;k<=4;k++) { sum=0; head=person[k]; if( head!='A' ) sum++; if( head=='C' ) sum++; if( head=='D' ) sum++; if( head!='D' ) sum++; if(sum==3) System.out.println(head); }
(1)假定让head=‘A’代入四句话中,逻辑
结果如表11-3所示。4个关系表达式的逻辑值的
和为1,显然A不是主谋。
说话人
说的话
关系表达式
逻辑值
A
head!=‘A’;
‘A’!=‘A’
0
B
head==‘C’;
‘A’==‘C’
0
C
head==‘D’;
‘A’==‘D’
0
D
head!=‘D’;
‘A’!=‘D’
Βιβλιοθήκη Baidu
【例3】明带两个妹妹参加元宵灯会。别 人问她们多大了,她们调皮地说:“我们 俩的年龄之积是年龄之和的6倍”。小明 又补充说:“她们可不是双胞胎,年龄差 肯定也不超过8岁啊。”请你计算出:小 明的较小的妹妹的年龄。
思路分析:
1
(2)假定让head=‘B’代入四句话中,…… (3)假定让head=‘C’代入四句话中,…… (4)假定让head=‘D’代入四句话中,……
下面我们将分析过程转化为程序: 由于枚举的答案和验证的次数都是4次,
所以我们需要一个执行次数为4的循环, 这里推荐使用for循环:
for(k=1;k<=4;k++) { //循环体内进行答案枚举和验证 }
显然该方程组应有无数多解,因为根据代数知识 ,该方程组必有一个自由未知数,因此其解是无 数组的。但是作为一个实际问题,其解是有限的 。因为这里有约束条件:所有解(x、y、z取值) 必须为正整数。所以,这就把该问题的解集放到 了一个有限的空间内来进行讨论。
因此,解决百钱买百鸡问题最为直观的方法 就是在x、y、z的取值空间上枚举出所有可 能的取值,只要x、y、z的取值满足上述两 个方程,就一定是百钱买百鸡问题的解。
令主谋为1,从犯为0,可以有如下4种状 态(情况):
状态
A
B
C
D
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1
这四种状态可简化写成:
状态 1 2 3 4
赋值表达式 head=‘A’ head=‘B’ head=‘C’ head=‘D’
所谓枚举是按照者四种假定逐一地去测试四个人 的话有几句是真话,如果不满足三句为真,就否 定掉这一假定,换下一个状态再试。
}
【例2】公元前5世纪末,我国古代数学家 张丘建在《算经》中提出了“百鸡问题”。 大意为:公鸡5元1只,母鸡3元1只,小 鸡1元3只,100元钱要买100只鸡,问公 鸡、母鸡和小鸡各买多少只?
思路分析:如果用数学的方法解决百钱买百鸡问 题,可将该问题抽象成如下的方程组:设公鸡x只 ,母鸡y只,小鸡z只,则:
在循环体内我们需要进行答案的枚举和验证,答案的枚举 就是罗列主谋,语句为:
head=person[k];
答案验证即对他们所说的话进行真假判断的语句为:
if( head!='A' ) sum++;
if( head=='C' ) sum++;
if( head=='D' ) sum++;
if( head!='D' ) sum++;
下面分析x、y、z的取值范围:
(1)如果把100元全部用来买公鸡,最多买 20只,所以x的取值范围为0-19。
(2)如果把100元全部用来买公母鸡,最多买 33只,还剩1元,所以y的取值范围为0-33。
(3)如果把100元全部用来买小鸡,最多买 300只,但题目只要求买100只鸡,所以z的取
for(y=0;y<34;y++) for(z=0;z<101;z+=3)
if((5*x+3*y+z/3==100)&&(x+y+z==100))
System.out.println("公鸡有"+x+"只,"+"母鸡 有"+y+"只,"+"小鸡有"+z+"只");
}
【思考】如果一个袋子里放有12个球,其 中3个红球,3个白球,6个黑球,从中任 取8个球,问有多少种不同颜色的搭配?
枚举法具有以下三个特点:
第一,通过枚举法得到的结果肯定是正确的; 第二,枚举法要将所有可能的答案列举出来,效率必然低下,浪
费时间; 第三,枚举法会涉及到求极值。
枚举法
【例1】警察抓到A,B,C,D四个罪犯,在审问
他们谁是主谋时,他们说:
A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。
这样我们就可以用三层循环来控制x、y、 z的枚举值:
for(x=0;x<20;x++) for(y=0;y<34;y++) for(z=0;z<101;z+=3) { //验证解的正确性 }
public static void main(String[] args) { int x,y,z; for(x=0;x<20;x++)
相关文档
最新文档