数据结构与算法(C语言版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 蛮力法

2.1.1 蛮力法的设计思想

蛮力法(bruteforcemethod,也称穷举法)通常采用一定的策略依次处理待求解问题的所有数据,从而找出问题的解,是一种简单直接地解决问题的方法。例如,对于给定的整数a和非负整数n,计算an的值,最直接的想法就是把1和a相乘n次。

蛮力法常常直接基于问题的描述,所以是最容易应用的方法。但是,用蛮力法设计的算法其时间性能往往也是最低的。因此,蛮力法通常用来解决非常基本的问题。在本书中,有关线性表的基本操作、顺序查找算法、模式匹配BF算法、起泡排序、简单选择排序等算法都是蛮力法的应用实例。

2.1.2 算法设计实例——数字谜

【问题】 求解如图2-1所示数字谜。

图2-1 数字谜

【想法】 将A、B、C依次试探每一个可能解,约束条件是满足等式关系(ABB)×B=ACBC。

【算法】 注意到,A的穷举范围是1~9,B的穷举范围是2~9(因为乘法结果有进位,则B至少是2),C的穷举范围是0~9,算法用伪代码描述如下:

算法:数字谜

输入:

输出:三个整数A、B和C

1.初始化结果标志flag=0;

2.将A从1到9依次试探

2.1 将B从2到9依次试探

2.1.1 将C从0到9依次试探

2.1.1.1 temp1←计算ABB的值;

2.1.1.2 temp2←计算ACBC的值;

2.1.1.3 如果temp1*B等于temp2,则输出A、B和C的值;结果标志flag=1;

3.如果结果标志flag等于0,则输出“无解”;

【程序】 可以在主函数中直接实现数字谜算法,程序如下:

            #include<stdio.h>                            //使用库函数printf
            intmain()
            {
              intA,B,C,temp1,temp2,flag=0;
              for(A=1;A<=9;A++)                      //将A从1到9依次试探
                  for(B=2;B<=9;B++)                  //将B从2到9依次试探
                    for(C=0;C<=9;C++)                //将C从0到9依次试探
                    {
                      temp1=A*100+B*10+B;                //计算ABB的值
                      temp2=A*1000+C*100+B*10+C;         //计算ACBC的值
                      if(temp1*B==temp2)                //如果ABB*B等于ACBC
                      {
                        printf("A=%d,B=%d,C=%d\n",A,B,C);    //输出结果
                        printf("%d×%d=%d\n",temp1,B,temp2);
                        flag=1;
                      }                                   //结束if语句
                    }                                     //结束内层for循环
                  if(flag==0)printf("无解\n");     //穷举过程中没有满足约束条件的解
                  return0;                               //将0返回操作系统,表明程序正常结束
              }