啊哈磊老师的《啊哈!算法》学习记录。

枚举法可以直观的解决我们的问题,但是会浪费时间。
比如我们有一个:【】【】【】+【】【】【】=【】【】【】,我们将1~9填入到里面,那么有多少种方法呢?
使用枚举可以直观的写出来:

#include<stdio.h>
int main()
{int a,b,c,d,e,f,g,h,i;int sum=0,n;for(a=1;a<=9;a++)for(b=1;b<=9;b++)for(c=1;c<=9;c++)for(d=1;d<=9;d++)for(e=1;e<=9;e++)for(f=1;f<=9;f++)for(g=1;g<=9;g++)for(h=1;h<=9;h++)for(i=1;i<=9;i++)if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&e!=f&&e!=g&&e!=h&&e!=i&&f!=g&&f!=h&&f!=i&&g!=h&&g!=i&&h!=i&&100*a+10*b+c+100*d+10*e+f==100*g+10*h+i){sum++;}n=sum/2;//有相同的情况printf("%d种",n);getchar();getchar();return 0;
}

上面的代码也可以用一个数组来承接:

#include<stdio.h>
int main()
{int array[10],i,total,book[10],sum,n;total=0;for(array[1]=1;array[1]<=9;array[1]++)for(array[2]=1;array[2]<=9;array[2]++)for(array[3]=1;array[3]<=9;array[3]++)for(array[4]=1;array[4]<=9;array[4]++)for(array[5]=1;array[5]<=9;array[5]++)for(array[6]=1;array[6]<=9;array[6]++)for(array[7]=1;array[7]<=9;array[7]++)for(array[8]=1;array[8]<=9;array[8]++)for(array[9]=1;array[9]<=9;array[9]++){for(i=1;i<=9;i++){book[i]=0;}for(i=1;i<=9;i++){book[array[i]]=1;}sum=0;for(i=1;i<=9;i++){sum=sum+book[i];}if(sum==9&&array[1]*100+array[2]*10+array[3]+array[4]*100+array[5]*10+array[6]==array[7]*100+array[8]*10+array[9]){total++;}  }n=total/2;printf("%d种",n);getchar();getchar();return 0;
}

书中有一个炸弹人的栗子:大概的意思是通过放置炸弹的方法来消灭敌人,炸弹只能放置在空地上,炸弹可以往上下左右的四个方向前进,遇到墙就会被挡住,遇到敌人会把敌人消灭,游戏里还有一种墙可以被炸开,但是炸开后无法穿透。然后现有一个超级炸弹,可以无限距离,然后我们的炸弹放到哪里才能炸掉最多的人呢?

作者给了一种想法,就是把墙用 # 表示,敌人使用G来表示,我们的空闲区域使用 . 来表示。然后我们使用一个二维的字符串数组来储存我们的地图,用两个变量来表示行和列的关系。

#include<stdio.h>
int main()
{char array[21][21];int m,n;int x,y;int sum;//可以消灭掉的敌人数量scanf("%d %d",&n,&m);int i,j;int p,q,map;//定义变量不要定义到循环语句内,否则成为局部变量,应当定义为全局变量。for(i=0;i<=n-1;i++)//读取n行字符 {scanf("%s",array[i]);}for(i=0;i<=n-1;i++){//int j;for(j=0;j<=m-1;j++){if(array[i][j]=='.')//平地放炸弹 {//int sum;//可以消灭掉的敌人数量 sum=0;//int x,y;x=i;y=j;//向上攻击while(array[x][y]!='#')//不是墙的话 {//再看有没有人if(array[x][y]=='G'){sum++;} x--;//继续向上统计 }x=i;y=j;//向下攻击while(array[x][y]!='#'){if(array[x][y]=='G'){sum++;}x++;}x=i;y=j;//向右攻击 while(array[x][y]!='#'){if(array[x][y]=='G'){sum++;}y++; }x=i;y=j;//向左攻击while(array[x][y]!='#'){if(array[x][y]=='G'){sum++;}y--;}if(sum>map)//不断更新比较{map=sum;p=i;q=j;}        }}}printf("(%d , %d)处可以消灭%d个敌人\n",p,q,map);getchar();getchar();return 0;}

书中作者还提到了一个叫做“火柴棍等式”的问题,按我个人理解,并查了一些资料,感觉书上写的稍有一些模糊,我们先看一下问题是什么:


然后他问:假如现在小哼手上有m根(m≤24)火柴棍,那么小哼究竟可以拼出多少个不同的方式呢?

最直白的方法,我们可以用枚举把每一位都举出来,建立之间的关系式,而作者也写到了,这样大概会运行1000多秒。所以作者举了一个栗子,就是枚举A和B,那么C就是A+B来表示。

#include<stdio.h>
int fun(int x)
{int num=0;int book[10]={6,2,5,5,4,5,6,3,7,6};  //用一个数组记录0到9数字所需的火柴棍数while(x/10!=0)  // x除以10不等于0的话,说明该数至少有两位{num=num+book[x%10];x=x/10;}num=num+book[x];  //加上最高位的火柴棍数return num;
}
int main()
{int a,b,c,m,sum=0;scanf("%d",&m);   //火柴棍总个数//书上是1111,但是这里写成11111会更好理解一些for(a=0;a<=11111;a++)   //开始枚举{for(b=0;b<=11111;b++){c=a+b;if(fun(a)+fun(b)+fun(c)==m-4){printf("%d+%d=%d\n",a,b,c);sum++;}}}printf("%d种方法",sum);return 0;
}

对于“1111”的理解,可以参考此位博主的文章: 关于《啊哈!算法》第三章火柴棍等式“1111”问题的解析。

数的全排列
将1,2,3全排列,有多少种方式?

#include<stdio.h>
int main()
{int a,b,c;for(a=1;a<=3;a++)for(b=1;b<=3;b++)for(c=1;c<=3;c++)if(a!=b&&a!=c&&b!=c)printf("%d%d%d\n",a,b,c);return 0;
}

当数据更大的时候,使用这种方法就不行了,之后的“搜索”会帮助我们。

算法打卡~

枚举法------《啊哈!算法》相关推荐

  1. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  2. 枚举法用什么算法结构计算机,计算机常用算法枚举算法2-2014

    <计算机常用算法枚举算法2-2014>由会员分享,可在线阅读,更多相关<计算机常用算法枚举算法2-2014(18页珍藏版)>请在人人文库网上搜索. 1.第三讲 (遍历算法) ( ...

  3. 算法:枚举法---kotlin

    枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...

  4. 【算法设计zxd】第四章蛮力法 1.枚举法 02穷举查找

    目录 蛮力法(brute force): [例4-1]链环数字对  问题分析  计算模型 pair_digital(int n): 代码: [例4-2]解数字迷: 思考题:ACM预测:​ 问题分析 ...

  5. 【枚举算法】枚举法概念

    枚举法,也称为列举法.穷举法,是暴力策略的具体体现,又称为蛮力法. 枚举法的基本思想是: 逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除. 枚举模式: 1)区间枚举 ...

  6. 常见算法思想1:枚举法

    一.枚举法 枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的. 使用枚举算法解题的基本思路如下所示: (1)确定枚举对象.枚举范围和判定条件. ...

  7. 算法编程例题——枚举法

    例一:百钱买白鸡 1,问题描述: 公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡.母鸡.小鸡各多少只? 例二:使用枚举法解决"填写运算符问题" 1,问题描 ...

  8. 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)

    最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...

  9. c语言穷举算法 枚举法,c语言枚举法 穷举法 ppt课件

    枚举法 穷举法 笨人之法 把所有可能的情况一一测试 筛选出符合条件的各种结果进行输出 分析 这是个不定方程 三元一次方程组问题 三个变量 两个方程 x y z 1005x 3y z 3 100设公鸡为 ...

最新文章

  1. WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类
  2. php 请求拦截,解决拦截器对ajax请求的拦截实例详解
  3. Winform中实现根据CPU和硬盘获取机器码
  4. 【LeetCode】6.Z 字形变换
  5. OAuth2.0在项目中的应用
  6. 物联网时代,隐私还有救吗?
  7. PMP考试重点总结二——启动过程组
  8. C#使用DirectoryEntry类操作Windows帐户
  9. 无法定位libjasper-dev
  10. 城市智能交通指挥中心系统方案
  11. 一、数据挖掘—初识数据挖掘
  12. 兜兜转转,又回到了这里
  13. 基于单片机的自行车码表设计
  14. 新东方雅思词汇(List 21~ List 25)
  15. 工程硕士计算机专业开题报告,计算机技术工程硕士论文
  16. 【algorithm】源码详解中国大陆新身份证号码算法
  17. Spark快速入门指南
  18. 如何激活word2010
  19. android手机号码恢复,手把手教你如何恢复安卓手机通讯录里面丢失的数据
  20. 汽油后面跟的90#、93#、95#、97#是什么意思

热门文章

  1. 通往优秀技术领导力之路开篇词 卓越的团队必然有一个卓越的领导
  2. 人工智能概论学习笔记(一):CPU GPU
  3. 调用第三方接口报java.net.UnknownHostException
  4. dlna移植android系统,基于Android的DLNA互动视频系统的设计与实现
  5. sql server锁机制
  6. 2006-08 贵州5日之行
  7. python绘制笑脸图-怎么用python实现画笑脸
  8. 我的ganymede怎么回事啊
  9. 丹斯克银行排除提供加密货币交易的可能性,但不会阻碍客户使用信用卡购买加密货币
  10. Js-parentNode、parentElement,childNodes、children 的区别