- 博客(17)
- 收藏
- 关注
原创 L-shapes题解
现给你一个矩形网格。确定它是否仅包含L形,其中L形不能接触边或角,也就是说网格中的每个阴影单元正好是一个L形的一部分,并且没有两个L形通过边或角相邻。L形在网格纸上形如下面的前四张图片。L形正好包含三个阴影单元(用*表示),可以以任何方式旋转。例如,上图中的最后两个网格不满足条件,因为两个L形分别通过角和边缘接触。如果网格满足条件,则输出“YES”,否则输出“NO”。
2024-02-22 23:07:44 847 1
原创 最短路径Floyd-Warshall的理解
代码中a[i][j]代表从i到j的距离,如0->5, a[i][4]+a[4][j]如0->4和4->5的距离。如果(a[i][j]>a[i][4]+a[4][j]) 则a[i][j]=a[i][4]+a[4][j]。即在矩阵中0->5的距离发生改变,看似是0->5,实则是0->4->5。例如从0->5,直接到达的距离是100,从0->4->5的距离是90,而从0->2->3->5的距离是70。如图,如何求两点之间的最短距离呢?首先将此图转换为一个邻接矩阵。2:通过中转站的方式到达。
2024-02-21 22:53:20 412
原创 最小生成树kruskal算法
最小生成树通俗易懂的讲就是包含原图的所有节点而只用最少的边和最小的权值距离最小生成树的理解:最小+树最小:一个图,可以有很多生成树,我们把一棵树的权值相加,得到权值和。因此不同的生成树就会有不同的权值和,而最小生成树就是权值和最小生成树。树:1、该图是树状结构,不会出现被圈起来的形状2、对于N条顶点,有N-1条边。
2024-02-20 23:51:58 371
原创 使用链表实现一个栈
一、栈的基本概念1、栈的定义栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
2024-02-18 23:44:33 374
原创 链表之尾部插入
第二次循环 由前面第一次循环现在链表已经有两个结点了,这就需要made=made->next了,这可以看成是递归形式,也可以另类的理解原本made->next存的是下一个结点的地址,将made=made->next不就等同于将made向后移了一位,即made变成下一结点了,在进行判断直到到最后的结点循环结束,然后给temp节点添加到链表的尾部,使得链表中新增了一个节点,同时更新了链表的尾部节点。然后就是初始化head 指针,使其指向0,这里还要定义一个made指针,下面会说到用处,同样的初始化。
2024-02-18 23:25:48 529
原创 链表代码解读
链表常规的操作就是节点的插入和删除,为了顺利的插入,通常一条链 表我们会人为地规定一个根节点,这个根节点称为生产者。当我们需要做一个成绩管理系统,人数可能为全校学生,也可能为一个班的学生,当我们开辟一个班的数组大小时,如果要存储整个学校的人数时,会出现内存不够用的情况;,表示新节点成为了链表的头部,而且是链表中的第一个节点,因此它的。是一个指向链表中的节点的指针,而不是指向链表头部节点的指针。指向的地址中存储的内容,也就是指向的是链表的头部节点的地址。指向的地址中存储的内容,也就是链表头部节点的地址。
2024-02-08 23:33:06 857
原创 修复公路(并查集)
给出 A 地区的村庄数 N,和公路数 M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)。下面 M 行,每行 33 个正整数 x,y,t,告诉你这条公路连着 x,y 两个村庄,在时间t时能修复完成这条公路。如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 −1−1,否则输出最早什么时候任意两个村庄能够通车。第 11 行两个正整数N,M。
2024-02-07 22:29:45 348 1
原创 【模板】并查集
对于每一个 Zi=2 的操作,都有一行输出,每行包含一个大写字母,为。当Zi=2 时,输出Xi 与 Yi 是否在同一集合内,是的输出。第一行包含两个整数N,M ,表示共有 N 个元素和 M 个操作。接下来 M 行,每行包含三个整数 Zi,Xi,Yi。当Zi=1 时,将 Xi 与Yi 所在的集合合并。
2024-02-06 23:31:13 349 1
原创 快速排序算法
接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。第一次交换:考虑到要把基准数作为交换数去比较,如果选择的基准数在左边,则从右边开始比较,如果选择的基准数在右边,从左边开始比较,这样可以保证开始被替换的数字永远是基准数。
2024-02-05 23:46:36 348 1
原创 广度优先搜索(迷宫问题)
通过队列来实现,找到迷宫的起点(S)入队,出队列里面的队首,把队首上下左右相邻的点入队列,一直重复此操作,直到队列里面的所有元素都出队表示该迷宫不存在解,如果在队清空之前找到终点(T)的话,一层一层的遍历,找到的话就一定是最短路了,但是简单的BFS只能通过输出(now.d+1)来表示最短路的步数长度,不能表示出。顾名思义就是以迷宫里的无向图某一个点,借助队列,一层一层以该点为中心散开进行搜索,简单的BFS只能显示出最短路径的长度,这里探讨的就是如何实现BFS对最短路径的输出。
2024-02-02 23:29:41 533
原创 递归之放苹果
把 m 个同样的苹果放在 n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,1 和 1,1,5是同一种方法)
2024-02-01 23:29:07 319 1
原创 单调队列(滑动窗口)
输入一共有两行,第一行有两个正整数 �,�n,k。第二行 �n 个整数,表示序列 �a。输出共两行,第一行为每次窗口滑动的最小值。该题运用到了单调队列的方法去写。第二行为每次窗口滑动的最大值。
2024-01-31 23:42:40 352
原创 八皇后问题
在代码中,使用了一个递归的dfs函数来尝试放置皇后。当放置完所有皇后后,sum变量记录满足条件的解的数量,并且输出前三个解的具体位置。一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。一行一个正整数 n,表示棋盘是n×n 大小的。最后一行是解的总个数。
2024-01-30 23:25:22 342 1
原创 邻接矩阵深度优先遍历(高手去散步)
高手的那个它,不喜欢太刺激的过程,因此那些没有路的观景点高手是不会选择去的。而高手想让他们在一起的路程最长(观景时它不会理高手),已知高手的穿梭机可以让他们在任意一个观景点出发,也在任意一个观景点结束。这题其实就是将景点看成带权无向图形式,然后再将其转化成矩阵的形式,最后用一下深度优先搜索就可以搞定,因为景点不固定,所以在主函数用了一个循环对在1,2,3,4这四个景点进行选择。第一行,两个用空格隔开的整数 �n 、 �.m. 之后 �m 行,为每条游步道的信息:两端观景点编号、长度。
2024-01-29 23:20:17 414
原创 深度优先搜索(迷宫问题)
同第一个代码一样,需要设一个book[]数组来判断是否走过,如果没走过并且不是死路,就可以进入,然后再if中再次调用dfs函数去走下一步,这就用到嵌套了,这是一步很巧妙的写法,如果到达了终点也可以通过这一层层的嵌套进行回溯,这也是为什么dfs函数后面将book又变成0,即未走过了。上面这个题就是简单的用深度优先搜索来解决的迷宫问题,就是下面这个代码的进阶版,即二维数组的版本,只要了解下面代码原理,就可以由点及面,解决这个简单的走迷宫问题。最后输入迷宫的起点坐标(x,y)和小哈所在的位置(q,p)。
2024-01-28 22:29:14 681
原创 深度优先搜索
深度优先搜索(DFS,Depth-First Search)是搜索算法的一种,它从某一个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。我们先来看一下深度优先搜索的搜索树:从这个搜索树中可以看出,DFS是从根节点出发,每次遍历它的第一个孩子节点,当遍历到叶子节点时候,回退一步返回到它的父亲节点,接着遍历父亲节点的其它孩子节点。如此重复,直到遍历完所有节点。
2024-01-26 23:07:30 373
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人