啊哈算法学习
啊哈算法的笔记学习
程序白痴
进击的程序猿………………
展开
-
5-2.1 图的深度优先遍历
给出如下的城市图:从图中可知有5个城市,8条公路,我们可以用5*5的矩阵来存储这些信息:例如找出1号城市到5号城市的最短路径是多少:代码:#include <stdio.h>int min = 9999999, book[101], n, e[101][101];//我们假设9999999是正无穷 //cur是当前所在城市的编号,dis是当前已经做过的过程void dfs(int cur, int dis){ int j; //如果当前走过的路程原创 2020-06-15 09:12:04 · 219 阅读 · 0 评论 -
算法学习 5-1.1深度优先遍历
深度和广度的概念是针对图而言的。我们可以用邻接矩阵来存储图中每一个节点的关系。例如一个无向图:深度优先遍历代码:#include <stdio.h>int book[101], sum, n, e[101][101];void dfs(int cur)//cur是当前所在的顶点编号{ int i; printf(" %d", cur); sum++;//每访问一个顶点,sum就+1 if (sum == n) return;//所有顶点都已访问过则直接退出 for.原创 2020-06-10 15:02:40 · 193 阅读 · 0 评论 -
算法学习 4.3——例题
有一个5x4大小的迷宫,请你找出第一行第一列单元格到第四行第三列的最短路径。其中第一行第三列,第三行第三列,第四行第二列,第五行第四列有障碍物,无法通过。用广度优先搜索代码————————————————————————#include <stdio.h>struct node { int x;//横坐标 int y;//纵坐标 int s;//步数};int main(){ struct node que[2501]; int a[51][51] = { 0 .原创 2020-06-08 09:13:06 · 178 阅读 · 0 评论 -
算法学习 4.2————例题
有一个5x4大小的迷宫,请你找出第一行第一列单元格到第四行第三列的最短路径。其中第一行第三列,第三行第三列,第四行第二列,第五行第四列有障碍物,无法通过。用dfs算法实现。代码————————————————————————#include <stdio.h>int n, m, p, q, min = 99999;int a[51][51], book[51][51];void dfs(int x,int y,int step)//step表示现在处理第几个数{ int .原创 2020-06-06 09:25:14 · 205 阅读 · 0 评论 -
算法学习 4.1——深度优先搜索
深度优先搜索算法的基本模型如下:void dfs(int step){ 判断边界 尝试每一种可能for(i=1;i<n;i++) { 继续下一步 dfs(step+1) } 返回}深度优先搜索的关键在于解决“当下该如何做”。下一步如何做可以递归调用当下该如何做。例如:有n张牌,输出牌的可能排列的顺序:#include <stdio.h>int a[10], book[10], n;void dfs(int step)//.原创 2020-06-05 09:12:53 · 223 阅读 · 0 评论 -
算法 3.3——火柴棍等式
现在有n跟火柴棍,希望拼出A+B=C的等式。等式中的A,B,C均是用火柴棍拼出来的整数。0需要6根火柴,1需要2根火柴,2需要5根火柴,3需要5个火柴,4需要4根火柴,5需要5根火柴,6需要6根火柴,7需要3根火柴,8需要7根火柴,9需要6根火柴。加号与等号各自需要2根火柴。如果A!=B,则A+B=C与B+A=C视为不同的等式(A,B,C都大于0)所有火柴棍必须都用上。假如有m根(m<=24)根火柴棍,那么可以拼出多少个不同形式的A+B=C的等式。思考后:——————————————代.原创 2020-06-04 15:13:24 · 853 阅读 · 0 评论 -
算法学习 3.1+3.2—————枚举以及简化版炸弹人
这两节内容主要讲的是枚举的简单运用。例如一道数学题:()3X6528=3()X8256,在两个括号内填入相同的数字使得等式成立。这个用枚举很简单:#include <stdio.h>int main(){ for (int i = 1; i <= 9; i++) { if ((i * 10 + 3) * 6528 == (30 + i) * 8256) printf("%d", i); } return 0;}那如果是()*() ()+()() ()=()(原创 2020-06-02 15:27:16 · 309 阅读 · 1 评论 -
算法学习 2.5——模拟链表
模拟链表是链表的另一种表示方式,不使用指针。(但指针的操作的确方便快捷,如果实在搞不懂指针实现链表的朋友就算了)什么是模拟链表呢,经过上一节的学习我们知道链表是通过节点的指针指向下一个节点的地址,所谓地址可不可以模拟成位置呢?仔细想一想,往下看——————————————————————————————————既然链表中的节点分为数据和指针地址,那么我们可不可以使用两个数组,一个数组用来存放数据,另一个数组用来存放地址呢。存放什么地址合适?这里的地址我们可以看成位置,链表中的节点指针存放的是下一原创 2020-06-01 10:32:50 · 249 阅读 · 0 评论 -
算法学习 2.4——链表
前言:在存储一大波数的时候我们通常用的是数组,但有时候数组显得不太灵活例如:从小到大排好的一串数字:2 3 5 8 9 10 18 26 32,我们要插入6使得其顺序依然不变,如果用数组的话就要让8以及8往后的数都要往后挪一位,很浪费时间,但如果用链表操作只需要将5的指针指向6的指针,再将6的指针指向8,这样一组数字就串起来啦!(对指针不了解的朋友建议学习链表之前先了解指针)—————————————————————————————————链表是由一种叫做节点的结构体类型构成的。下面我们来进行操原创 2020-05-31 19:08:20 · 126 阅读 · 0 评论 -
算法学习 2.3纸牌游戏——小猫钓鱼
这是一章对前面的队列,栈的操作进行运用的一个实例。玩家A和玩家B玩纸牌游戏小猫钓鱼,游戏规则如下:一副纸牌,平均分成两份,每人拿一份(这里就用数字代替了)。玩家A先拿出一张纸牌放在桌子上,玩家B再拿一张纸牌放在桌子上。就这样两人交替出牌。如果某人打出的牌与桌子上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中的牌的末尾。当任意一方的牌全部出完时,游戏结束,对手获胜。题目分析:玩家共有两种操作:出牌=出队,收牌=入队。桌子就相当于一个栈,打出一个牌放到桌子上原创 2020-05-30 20:26:16 · 2201 阅读 · 1 评论 -
算法学习 1.1桶排序
(今天开始学习啊哈算法,这本算法数真的挺好的,不管处于什么阶段的算法学习都可以借鉴,我就把自己的学习心得同大家分享分享,坚持每日更新,加油!下面我附上这本书的图片,感兴趣的朋友可以去买一本看看哈)第一节 桶排序算法(简化版)生活中到处都是被排序的东西,最为常见的就是数字了,桶排序算法就是借用一个一位数组去解决排序问题。(仔细想想哦)仔细想想其实排序就是把一堆数字放在他应该存在的地方,那么在一位数组里,我们只需要把自己需要排序的数放在他所对应的位置就行了。例如:1我们就可以把它放在a[1]这个位置原创 2020-05-24 10:46:51 · 160 阅读 · 0 评论 -
算法学习 1.2冒泡排序
在上一节的桶排序算法中,我们不难发现有几个问题:桶排序仅仅是对数字本身进行排序,要是数字本身还对应着人的名字或者什么,它是无法将这些按照大小输出的,例如:名字+成绩,只能输出成绩的顺序,却无法将名字按顺序输出。浪费空间。例如:将1,20000,60000比较大小,我们需要申请60001空间大小,明明只要排三个数,实在是太浪费空间了。所以今天我们继续来学习冒泡排序,他能较好的解决以上问题。冒泡排序,这是一个很优美的名字,顾名思义,我们想象一下水里的气泡,冒泡排序的名字其实就是这么来的,一组数中,原创 2020-05-25 10:54:02 · 146 阅读 · 0 评论 -
算法学习 1.3最常用的排序——快速排序
上一节的冒泡排序虽然解决了桶排序的空间浪费问题,但是在算法的执行效率上却牺牲了很多,今天来学习一种新的算法,快速排序。他虽然最大时间复杂度和冒泡排序原创 2020-05-26 20:46:45 · 185 阅读 · 0 评论 -
算法学习 2.1 队列
简单来说队列的特点:先进先出。用一个比喻来说:新来的人总是站在队列的最后面,来得越早的人越靠前,也就越早的人越靠前,也就越早能买到票,就是先来的人先服务。队列中我们通常会定义一个head(队首)和tail(队尾),便于操作。现在我们写代码来实现队列的操作。(用结构体来实现)下面先来一个简单的操作:对6,3,1,7,5,8,9,2,4进行操作代码:#include <stdio.h>int main() { int q[102] = { 0,6,3,1,7,5,8,9,2,4原创 2020-05-28 21:50:00 · 188 阅读 · 0 评论 -
算法学习 2.2 栈
这节我学习的是栈。栈的特点与队列的一个特点相反:栈是后进先出。后进先出。只能在一端进行插入和删除操作实现栈很简单,仅需要一个一位数组和指向栈顶的变量top就可以了。什么是栈顶呢?想象一个盒装的乐事薯片,装薯片的时候,最后一个进去的是不是要被我们第一个吃掉呢。(没有透明的抽屉!)栈顶就是我们吃的第一个薯片!栈的作用:一个非常简单地操作,判断一串字符是否是回文字符串。判断的原理:如果一个字符串是回文的,它必须有中间点,并且是对称的。将中间点之前的字符入队,再和中间点之后的字符一一比较,如果相同原创 2020-05-29 18:17:30 · 109 阅读 · 0 评论