《啊哈算法》——枚举

枚举法,作为编程世界里一个非常基本的方法或者说技巧,它也可以叫穷举法、暴力法、遍历法,深入了解一些算法后,你会发现它在算法世界当中的用途非常的广泛。

概括地说这种方法非常的简单,我们抽象点来说,对于一个问题的解x,这个解满足限制条件f(x),枚举法给出解决问题的方案是一一列举x所有可能的情况,然后判断是否满足限制条件f(x),如果满足,则x是问题的解;反之,不是。

枚举法虽然简单,但是在解决实际问题中往往伴随着比较巧妙的优化与筛选,而且在枚举算啊中体现出的“找到x所有可能的情况”,在其他的一些算法(比如计算几何)也有着用武之地。因此所谓暴力法看似暴力无脑,其实里面还是有很多需要深思熟虑的地方。

我们来看一个例子:对于()()()+()()() = ()()(),9个空填写1~9这9个数字各一次,请问会有多少种符合的情况?

显然我们枚举每一个()可能的取值,即[1,9],需要设置9层循环,然后判断这9个数是否相等,随后验证等式成立,但是基于这个思路编程我们发现在判断9个数是否相同的时候太过麻烦了,有没有较为简便的编码方式呢?

其实类似我们在第一章介绍的桶排序的方式,我们用a[i]表示第i个()的数字,然后我们用book[a[i]]来标记数字a[i]是否出现过,如果∑book[a[i]] = 9  ,则表明9个数字分别出现了一次,是满足限制条件的。

简单的参考代码如下。

#include<cstdio>
int main()
{
      int a[10] , i , total = 0 , book[10] , sum;

      for(a[1] = 1;a[1]<=9;a[1]++)
         for(a[2]=1;a[2]<=9;a[2]++)
           for(a[3]=1;a[3]<=9;a[3]++)
             for(a[4]=1;a[4]<=9;a[4]++)
               for(a[5]=1;a[5]<=9;a[5]++)
                 for(a[6]=1;a[6]<=9;a[6]++)
                   for(a[7]=1;a[7]<=9;a[7]++)
                     for(a[8]=1;a[8]<=9;a[8]++)
                       for(a[9]=1;a[9]<=1;a[9]++)
      {
            for(i = 1;i <= 9;i++)
                  book[i] = 0;
            for(i = 1;i <= 9;i++)
                   book[a[i]] = 1;
            sum = 0;
            for(i  =1 ;i <= 9;i++)
                  sum+= book[a[i]];

            if(sum==9 &&100*a[1] + 10*a[2] + a[3]
                      + 100*a[4] + 10*a[5] + a[6]
                    ==  100*a[7] + 10*a[8] + a[9])
            {
                  total++;
            }
      }

      printf("total = %d",total/2); //由加法交换律我们不难理解这里应该除2的,对于结果进行符合题意的筛选计算往往是枚举的关键
}
时间: 2024-10-22 19:21:29

《啊哈算法》——枚举的相关文章

C# 枚举

一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. 枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类型,继承自S

C++ 枚举定义

我们在平常的编程中,时常需要为一些属性定义一组可以选择的值,比如文件打开的状态可能会有三种:输入 输出和追加 我们一般情况下记录这些状态是让每一个状态和一个常数相对应   比如 1 const int input=0; 2 const int output=1; 3 const int append=2; 这个方法虽然也是可以得,不过它有一个明显的缺点就是    没有指出这些值是相关联的 而C++中的  枚举  提供了一种替代的方法   不但可以定义常数集   还可以将其聚集成组    如下:

java 枚举常用操作

在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { } JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { } public class TrafficLight { public void change() {

java 枚举的应用

使用枚举的方式 实现上一篇中介绍的例子:并增加功能,输出今天执行的内容: import java.util.Calendar;import java.util.Date; /** * 周 的枚举 */public enum Day { WORK(1, 2, 3, 4, 5) { @Override public void doThing() { System.out.println("工作..."); } },//工作日 STA(6) { @Override public void d

C#枚举类型的常用操作总结

枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型. 编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段.C#编译器将枚举类型视为基元类型. 1.获取枚举列表:         /// <summary>         /// 获取枚举列表         /// <

Swift学习之位移枚举的按位或运算

在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift语言里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 //位移枚举typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutores

【BZOJ-1218】激光炸弹 前缀和 + 枚举

1218: [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1778  Solved: 833[Submit][Status][Discuss] Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值.激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破

获取枚举类型Description特性的描述信息

C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExtensions { public static string GetDescription(this object value) { if (value==null) return string.Empty; Type type = value.GetType(); var fieldInfo = ty

JavaSE复习_6 枚举类

△单例类是指只有一个实例,而枚举类实际上就是有有限个实例的类,在类里已经把实例定义好了. △枚举类的三种创建形式: 1) enum Week { MON,TUE,WED;//枚举类有默认构造函数创建的三个实例} } 2) enum Week { MON("星期一"), TUE( "星期二"),WED ("星期三" ); //具有参数的构造函数 private String name; Week(String name) { this. name=

Android 开发 之 Enum (枚举) —— @IntDef的使用

官方文档说明,安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存.参 http://developer.android.com/training/articles/memory.html#Overhead 那么如果需要使用Enum应该怎么做呢? https://noobcoderblog.wordpress.com/2015/04/12/java-enum-and-android-intdefstringdef-annotation/ public class