逐个尝试所有可能的结果,再判断条件是否成立。

重点关注以下内容:

  • 可能的情况有哪些?
  • 要枚举哪些要素?
  • 枚举的范围和顺序是什么?如何缩减范围和及时排除不符合的结果?

枚举示例

  • OpenJudge - 2811:熄灯问题
    • 思路:按下第2行可以百分之百做到让第1行的灯全部熄灭,同理,按第3行可以熄灭第2行,按第4行可以熄灭第3行,按第5行可以熄灭第4行。
    • 问题出在第5行灯,由于没有第6行,所以第5行不知道该由谁来熄灭。
    • 针对第5行的问题,要从第1行开始着手,我们的目标是要从第1行中找出一种状态,使得按上面的操作结束之后第5行正好全部灯是熄灭的状态。
    • 为此应用枚举思想,枚举第1行灯的全部可能的按法,再依次推导出第2行、第3行、第4行、第5行的状态,如果第5行的状态刚好为全部熄灭状态,则结果合法。
  • OpenJudge - 2812:恼人的青蛙
    • 思路:只要两个点就可以确定一条路径并计算这条路径的长度,为此可以枚举所有的起点和第二跳的点,然后再判断得到的路径是否合法以及长度是否更大。
    • 枚举的过程应该及时排除不合法的路径,有三种情况要考虑:
      1. 由前两跳得到的下一跳的位置在稻田外面,无法构成一条合法的路径(至少3个点才能构成一条合法路径)。
      2. 前两跳的前一跳仍然在稻田里面,说明这条路径的起点选错了,还有比当前起点更适合作为起点的点。
      3. 由于当前的最大路径长度是已知的,在枚举下一个组合时,可以直接先计算一个按当前最优先解得到的路径结束位置是否仍在稻田里面,如果不在,则可以直接pass掉当前的起点组合。(这条其实已经把第1种情况包括进去了。)


  • 无标签