算法学习
少女終末旅行
雨だれの歌
展开
-
启发式搜索 | 十六格拼图 | 15Puzzle | C/C++实现
问题描述十六格拼图就是在4×4的格子上摆放15块拼图,空出一个格子,玩家要借助这1个空格上下左右滑动拼图,最终完成整幅图画我们像下面这样将空格定为0,然后给15块拼图分别标上1到15号1 2 3 46 7 8 05 10 11 129 13 14 151次操作可以将1块拼图移向空格,当15块拼图全部与下述位置吻合时完成游戏1 2 3 45 6 7 89 10 11 1213 ...原创 2019-02-20 22:23:02 · 2087 阅读 · 0 评论 -
动态规划 | 背包问题 | Knapsack Problem | C/C++实现
问题描述现有价值为viv_ivi、重量为wiw_iwi的N个物品以及容量为W的背包。请根据下述条件选择物品装入背包:所选物品的总价值尽可能高所选物品的总重量不超过W。输入:第1行输入2个整数N、W,用空格隔开。接下来N行输入第 i 个物品的价值viv_ivi与重量wiw_iwi,每个物品占1行,相邻数组之间用空格隔开。输出:输出总价值的最大值,占1行。限制:1 ≤ N ≤...原创 2019-02-18 17:55:44 · 638 阅读 · 0 评论 -
动态规划 | 硬币问题 | Coin Changing Problem | C/C++实现
问题描述现有面值为c1,c2,...,cmc_1,c_2,...,c_mc1,c2,...,cm元的m种硬币,求支付n元时所需硬币的最少枚数。各面值的硬币可重复使用任意次。输入:nnn mmmc1c_1c1 c2c_2c2 … cmc_mcm第1行输入整数n和整数m,用1个空格隔开。第2行输入各硬币的面值,相邻面值间用1个空格隔开。输出:输出所需硬币的最少枚数,占1行。...原创 2019-02-18 12:05:50 · 3312 阅读 · 0 评论 -
计算几何学 | 线段相交问题 | 平面扫描 | Segment Intersections: Manhattan Geometry | C/C++实现 | 曼哈顿几何
问题描述现给出n条平行于x轴或y轴的线段,请输出其交点数。输入:第1行输入线段数n。接下来n行输入n条线段。每条线段按照下述格式给出:x1x_1x1 y1y_1y1 x2x_2x2 y2y_2y2上面分别为线段两端点的坐标。各输入数据均为整数。输出:输出交点的总数,占1行。限制:1 ≤ n ≤ 100000互相平行的2条或更多线段之间不存在重叠的点或线段交点数不超过1...原创 2019-02-17 22:42:30 · 1372 阅读 · 0 评论 -
计算几何学 | 凸包 | Convex Hull | C/C++实现
问题描述求二维平面上的点集合P的凸包(Convex Hull)。凸包是指包含点集合P中所有点的最小凸多边形。请列举出该多边形的边及顶点上的所有点。输入:第1行输入点的数量n。接下来n行输入第 i 个点pip_ipi的坐标,坐标以2个整数xix_ixi、yiy_iyi的形式给出。输出:第1行输出表示凸包的凸多边形的顶点数。接下来的几行输出凸多边形各个顶点的坐标(x, y)。输出时以凸...原创 2019-02-17 20:14:43 · 1639 阅读 · 0 评论 -
计算几何学 | 点的内包 | Polygon-Point Containment | C/C++实现
问题描述对于多边形g与点p,p位于g内时输出2,p位于g的边上时输出1,其余情况输出0。多边形g由其顶点的序列p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn表示,相邻两点pip_ipi、pi+1p_{i+1}pi+1(1 ≤ i ≤ n-1)相连构成g的边。另外,点pnp_npn和p1p_1p1相连的线也是g的边。请注意,g不一定是凸多边形。输...原创 2019-02-17 17:17:29 · 899 阅读 · 1 评论 -
计算几何学 | 圆与圆的交点 | Cross Points of Circles | C/C++实现
问题描述求2个圆c1、c2的交点。输入:输入按照下述格式给出:c1x c1y c1rc2x c2y c2rc1x、c1y、c1r分别表示第1个圆的圆心x坐标、y坐标以及半径。同理,c2x、c2y、c2r表示第2个圆的坐标与半径。上述输入均为整数。输出:按下述规则输出交点p1、p2的坐标(x1, y1)、(x2, y2),相邻数据之间用空格隔开:只有1个交点时输出2个相同的坐标先...原创 2019-02-17 14:06:23 · 3348 阅读 · 1 评论 -
计算几何学 | 圆与直线的交点 | Cross Points of a Circle and a Line | C/C++实现
问题描述求圆c与直线lll的交点。输入:输入按照下述格式给出:cxcxcx cycycy rrrqqqLine1Line_1Line1Line2Line_2Line2…LineqLine_qLineq第1行输入圆心坐标cx,cy以及半径r。第2行输入问题数q。接下来q行按照下述格式输入q个直线LineiLine_iLinei作为问题。x1x_1x1 y1y_1y1...原创 2019-02-17 11:27:42 · 7514 阅读 · 5 评论 -
计算几何学 | 线段的交点 | Cross Point | C/C++实现
问题描述输出线段s1、s2交点的坐标。设s1的端点为p0、p1,s2的端点为p2、p3。输入:第1行输入问题数q。接下来q行给出q个问题。各问题线段s1、s2的坐标按照以下格式给出:xp0x_{p0}xp0 yp0y_{p0}yp0 xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2 xp3x_{p3}xp3 yp3y_{...原创 2019-02-16 23:39:35 · 3577 阅读 · 3 评论 -
关节点 | Articulation Point | C/C++实现
问题描述请列举出无向图G=(V,E)G=(V,E)G=(V,E)的关节点。在连通图G中,如果删除顶点u及从u出发的所有边后所得的子图不连通,我们就称顶点u为图G的关节点(Articulation Point)或连接点。输入:输入按照以下形式给出∣V∣|V|∣V∣ ∣E∣|E|∣E∣s0s_0s0 t0t_0t0s1s_1s1 t1t_1t1…s∣E∣−1s_{|E|-1}...原创 2019-02-13 12:17:27 · 1359 阅读 · 0 评论 -
树的直径 | Diameter of a Tree | C/C++实现
问题描述请求出权值非负的无向树T的直径。我们将树的最远结点之间的距离称为树的直径。输入:输入按照以下形式给出nnns1s_1s1 t1t_1t1 w1w_1w1s2s_2s2 t2t_2t2 w2w_2w2…sn−1s_{n-1}sn−1 tn−1t_{n-1}tn−1 wn−1w_{n-1}wn−1第1行输入表示树结点数的整数n。树的各结点编号分别为0到n-1...原创 2019-02-13 14:39:25 · 1149 阅读 · 0 评论 -
动态规划 + 二分搜索 | 最长递增子序列 | Longest Increasing Subsequence | C/C++实现
问题描述求数列A=a0,a1,...,an−1A=a_0,a_1,...,a_{n-1}A=a0,a1,...,an−1的最长递增子序列(LIS)。如果数列A的子序列ai0,ai1,...,aika_{i_0},a_{i_1},...,a_{i_k}ai0,ai1,...,aik满足0 ≤ i0i_0i0 ≤ i1i_1i1 ≤ … ≤ iki_kik ≤ n且ai0a_...原创 2019-02-18 22:26:17 · 338 阅读 · 0 评论 -
九宫格拼图 | 8Puzzle | C/C++实现
问题描述九宫格拼图就是在3×3的格子上摆放8块拼图,空出1个格子,玩家要借助这1个空格上下左右滑动拼图,最终完成整幅图画我们像下面这样将空格定为0,然后给8块拼图分别标上1到8号1 3 04 2 57 8 61次操作可以将1块拼图移向空格,当8块拼图全部与下述位置吻合时完成游戏1 2 34 5 67 8 0现给定九宫格拼图的初始状态,请编写一个程序,求出完成该九宫格拼图最少需要...原创 2019-02-20 16:02:49 · 7618 阅读 · 2 评论 -
八皇后问题 | Queens Problem | C/C++实现
问题描述所谓八皇后问题,是指在8×8的国际象棋棋盘上放置8个皇后,保证任意2个皇后都无法相互攻击的问题。国际象棋中的皇后可以向8个方向移动任意格现已在棋盘上摆放了k个皇后,且这k个格子的位置已给出。请编写一个程序,根据给出的k个有皇后的格子,输出已摆放8个皇后的国际象棋棋盘输入:第1行输入整数k。接下来k行输入已放有皇后的格子,每个格子用2个整数r、c表示。r、c分别为从0开始的国际象棋棋...原创 2019-02-20 12:35:44 · 494 阅读 · 0 评论 -
最大公约数 | Greatest Common Divisor | C/C++实现
问题描述请编写一个程序,输入两个自然数x、y,求它们的最大公约数对于两个整数x和y,如果x/d和y/d余数都为0,则d称为x和y的公约数,其中最大的称为x和y的最大公约数输入:输入x、y,用1个空格隔开,占1行输出:输出最大的公约数,占1行限制:1 ≤ x,y ≤ 10910^9109提示:对于整数x、y,如果x ≥ y,则x与y的最大公约数等于y与x%y的最大公约数输入示例...原创 2019-02-19 22:30:11 · 996 阅读 · 0 评论 -
质数检验 | 埃拉托色尼筛选法 | Prime Numbers | C/C++实现
问题描述指数指约数仅为1及其本身的自然数。比如8个最小的质数为2、3、5、7、11、13、17、19。1不是质数。请编写一个程序,输入n个整数,输出其中质数的个数输入:第1行输入n。接下来n行给出n个整数输出:输出质数的个数,占1行限制:1 ≤ n ≤ 100002 ≤ 给出的整数 ≤ 10810^8108输入示例6234567输出示例4讲解下面是检验...原创 2019-02-19 19:16:06 · 1007 阅读 · 0 评论 -
计算几何学 | 几何对象的基本元素与表现 | C/C++实现
点与向量用程序求解几何问题,先要想办法用编程中的数据结构来表示几何对象。这里,使用向量就是解决办法之一。我们将既有大小又有方向的量称为向量。相对地,只有大小没有方向的量称为标量。为了用数据结构表示向量,将向量考虑成从原点O(0, 0)指向对象点P(x, y)的有向线段。向量落实在纸面上容易给人带来一种误解,觉得向量可以表示平面上的线段。但实际上,向量只具有大小和方向,而线段却要由两个端点确定...原创 2019-02-14 13:25:57 · 862 阅读 · 0 评论 -
动态规划 | 最大长方形 | Largest Rectangle | C/C++实现
问题描述现有H×WH×WH×W个边长为1cm的正方形瓷砖排列在一起,其中有一部分瓷砖沾有污迹,求仅由干净瓷砖构成的最大长方形的面积。输入:HHH WWWc1,1c_{1,1}c1,1 c1,2c_{1,2}c1,2 … c1,Wc_{1,W}c1,Wc2,1c_{2,1}c2,1 c2,2c_{2,2}c2,2 … c2,Wc_{2,W}c2,W…cH,1c_{H,1}c...原创 2019-02-19 16:11:32 · 910 阅读 · 0 评论 -
动态规划 | 最大正方形 | Largest Square | C/C++实现
问题描述现有H×WH×WH×W个边长为1cm的正方形瓷砖排列在一起,其中有一部分瓷砖沾有污迹,求仅由干净瓷砖构成的最大正方形的面积。输入:HHH WWWc1,1c_{1,1}c1,1 c1,2c_{1,2}c1,2 … c1,Wc_{1,W}c1,Wc2,1c_{2,1}c2,1 c2,2c_{2,2}c2,2 … c2,Wc_{2,W}c2,W…cH,1c_{H,1}c...原创 2019-02-19 11:39:51 · 1353 阅读 · 1 评论 -
最小生成树 | Minimum Spanning Tree | 克鲁斯卡尔Kruskal算法 | C/C++实现
本文为克鲁斯卡尔算法(Kruskal’s Algorithm)对于求最小生成树的另一种算法:普里姆算法(Prim’s Algorithm)请见:最小生成树 | Minimum Spanning Tree | 普里姆Prim算法 | C/C++实现问题描述请编写一个程序,对于给定的加权图G=(V,E)G=(V,E)G=(V,E),输出其最小生成树的各边权值总和。输入:∣V∣|V|∣V∣ ∣...原创 2019-02-13 16:55:06 · 506 阅读 · 0 评论 -
计算几何学 | 判断线段相交 | Intersection | C/C++实现
问题描述对于线段s1、s2,如果相交则输出“1”,否则输出“0”。设s1的端点为p0、p1、,s2的端点为p2、p3。输入:第1行输入问题数q。接下来q行给出q个问题。各问题线段s1、s2的坐标按照以下格式给出:xp0x_{p0}xp0 yp0y_{p0}yp0 xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2 xp3x_...原创 2019-02-16 19:33:30 · 2571 阅读 · 1 评论 -
计算几何学 | 距离 | Distance | C/C++实现
问题描述输出线段s1、s2之间的距离。设s1的端点为p0、p1,s2的端点为p2、p3。输入:第1行输入问题数q。接下来q行给出q个问题。各问题线段s1、s2的坐标按照以下格式给出:xp0x_{p0}xp0 yp0y_{p0}yp0 xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2 xp3x_{p3}xp3 yp3y_{p...原创 2019-02-16 18:47:51 · 1940 阅读 · 0 评论 -
计算几何学 | 逆时针方向 | Counter-Clockwise | C/C++实现
问题描述对于三个点p0、p1、p2,请按照下列情况进行输出:p0、p1、p2成逆时针方向 COUNTER_CLOCKWISEp0、p1、p2成顺时针方向 CLOCKWISEp2、p0、p1依次排列在同一直线上 ONLINE_BACKp0、p1、p2依次排列在同一直线上 ONLINE_FRONTp2在线段p0p1上 ON_SEGMENT输入:xp0x_{p0}xp0 yp0y_{p...原创 2019-02-16 16:24:06 · 1554 阅读 · 0 评论 -
矩阵链乘法 | Matrix Chain Multiplication | 动态规划 | C/C++实现
问题描述对于给定的n个矩阵形成的矩阵链M1,M2,M3,...,MnM_1,M_2,M_3,...,M_nM1,M2,M3,...,Mn,求计算乘积M1M2M3,...MnM_1M_2M_3,...M_nM1M2M3,...Mn时最少次标量相乘的运算顺序,这类问题称为矩阵链乘法问题(Matrix Chain Multiplication Problem)。请编写一个程序,当给定...原创 2019-01-28 22:26:15 · 1530 阅读 · 1 评论 -
单源最短路径2 | Dijkstra狄克斯特拉 | Single Source Shortest Path 2 | C/C++实现
问题描述请编写一个程序,求给定加权有向图G=(V,E)G=(V,E)G=(V,E)的单源最短路径的成本。请以G的顶点0为起点,输出0到各顶点v的最短路径上各边权值的总和d[v]。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表u k v1 c1 v2 c2 … vk ckG中的各顶点编号分别为0至n-1。u代表顶点的编号,k代表u的出度。vi(i = 1, 2, …...原创 2019-02-02 21:55:37 · 361 阅读 · 0 评论 -
最长公共子序列 | 记忆化递归 | 动态规划 | LCS Longest Common Subsequences | C/C++实现
问题描述最长公共子序列问题(Longest Common Subsequence problem, LCS)是求两个给定序列X={x1, x2, …, xm}与Y={y1, y2, …, yn}最长公共子序列的问题。如果序列Z同时为X和Y的子序列,那么Z就称为X与Y的公共子序列。例,设X={a, b, c, b, d, a, b};Y={b, d, c, a, b, a},那么序列{b, c,...原创 2019-01-28 16:02:42 · 437 阅读 · 1 评论 -
单源最短路径1 | Dijkstra狄克斯特拉 | Single Source Shortest Path 1 | C/C++实现
问题描述请编写一个程序,求给定加权图有向图G=(V,E)G=(V,E)G=(V,E)的单源最短路径的成本。请以G的顶点0为起点,输出0到各顶点v的最短路径上各边权值的总和d[v]。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表:u k v1 c1 v2 c2 … vk ckG各顶点编号分别为0至n-1。u代表顶点的编号,k代表u的出度。vi (i = 1, 2, ...原创 2019-02-02 17:32:28 · 348 阅读 · 0 评论 -
最小成本排序 | Minimum Cost Sort | C/C++实现
问题描述有重量为wi(i = 0, 1, …, n - 1)的n个货物排成一列。现在要用机械臂将这些货物排序。机械臂每次操作可以提起货物i和货物j并交换二者位置,同时产生wi + wj的成本。机械臂的操作次数没有限制。请求出将给定货物列按重量升序排列时所需总成本的最小值。输入: 第1行输入整数n。第2行输入n个整数wi(i = 0, 1, 2, …, n - 1),用空格隔开。输出: 在1...原创 2019-01-27 01:04:09 · 1371 阅读 · 3 评论 -
逆序数 | The Number of Inversions | C/C++实现
问题描述数列A = {a0, a1, …, an-1}中,如果一组数(i, j)满足ai > aj且i < j,那么这组数就称为一个逆序,数列A中逆序的数量称为逆序数。逆序数与下述冒泡算法的交换次数相等。bubbleSort(A) cnt = 0 //逆序数 for i = 0 to A.length - 1 for j = A.length - 1 downto i + ...原创 2019-01-25 21:54:45 · 1341 阅读 · 1 评论 -
分治法的简单应用 | Koch Curve | 科赫曲线 | C/C++实现
问题描述请编写一个程序,输入整数n,输出科赫曲线的顶点坐标,该科赫曲线由深度为n的递归调用画出。科赫曲线是一种广为人知的不规则碎片形。不规则碎片形是具有递归结构的图形,可以通过下述递归函数的调用画出。1.将给定线段(p1, p2)sandengf。2.以三等分点s, t为顶点作出正三角形(s, u, t)。3.对线段(p1, s), 线段(s, u), 线段(u,t), 线段(t, p2...原创 2019-01-24 10:26:44 · 2292 阅读 · 2 评论 -
散列法的简单应用 | ALDS1_4_C: Dictionary | C实现
问题描述请实现一个能执行以下命令的简易字典insert str: 向字典中添加字符串strfind srt: 当前字典中包含str时输出yes,不包含时输出no输入 第1行中输入命令数n。随后n行按顺序输入n个命令。命令格式如上。输出 对于各find命令输出yes或no,每个输出占一行。限制 输入的字符串仅由“A”,“C”,“G”, “T”四种字母构成。(脱氧核糖核酸)1≤字符串长度...原创 2019-01-23 11:18:21 · 427 阅读 · 1 评论 -
互质的集合 | Disjoint Set: Union Find Tree | C/C++实现
问题描述请实现一个管理互质动态集合S = {S1, S2, …, Sk}的程序。首先读取整数n,创建由0, 1, …, n-1这样n个互不相同的元素组成的集合。然后读取整数q,对集合进行q个查询操作。查询包含以下2种:unite(x, y):合并包含x的集合SxS_xSx与包含y的集合SyS_ySysame(x, y):判断x与y是否包含于同一集合输入:n qcom1 x1 y...原创 2019-02-03 23:40:11 · 755 阅读 · 1 评论 -
范围搜索 | KD树 | Range Search (KD Tree) | C/C++实现 | 大年三十写CSDN
问题描述从拥有多个属性的报表集合(数据库)中,寻找具有特定属性且位于指定范围内的元素,这列问题被称为范围搜索。请编写一个程序,对于二维平面上点的集合,例举出给定范围内的点。另外,给定的点集合无法进行点的添加和删除操作。输入:nx0 y0x1 y1…xn-1 yn-1qsx0 tx0 sy0 ty0sx1 tx1 sy1 ty1…sxq-1 txq-1 sy1-1 tyq-...原创 2019-02-04 14:42:13 · 2729 阅读 · 0 评论 -
计算几何学 | 直线的正交/平行判定 | Parallel/Orthogonal | C/C++实现
问题描述对于直线s1、s2,当二者平行时输出2,正交时输出1.s1通过点p0、p1,s2通过点p2、p3。输入:第1行输入问题数q。接下来q行给出q个问题。各问题的点p0、p1、p2、p3的坐标按照以下格式给出:xp0x_{p0}xp0 yp0y_{p0}yp0 xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2 xp3x_{...原创 2019-02-15 10:34:44 · 2177 阅读 · 3 评论 -
计算几何学 | 映像 | Reflection | C/C++实现
问题描述对于三个点p1、p2、p,设以通过p1、p2的直线为对称轴与点p成线对称的点为x,求点x的坐标(点p对于直线p1p2的映像)。输入:输入按照以下格式给出:xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2qqqxp0x_{p0}xp0 yp0y_{p0}yp0xp1x_{p1}xp1 yp1y_{p1}yp1...原创 2019-02-16 11:02:31 · 558 阅读 · 0 评论 -
最小生成树 | Minimum Spanning Tree | 普里姆Prim算法 | C/C++实现
问题描述请编写一个程序,计算给定加权图G=(V,E)G=(V,E)G=(V,E)的最小生成树的各边权值之和。输入: 第1行输入G的顶点数n。接下来n行输入表示G的n∗nn*nn∗n邻接矩阵A。A的元素aija_{ij}aij代表顶点iii到顶点jjj的边的权值。另外,边不存在时记为-1。输出: 输出G的最小生成树的各边权值总和,占1行。限制:1 ≤ n ≤ 1000 ≤ aija_{...原创 2019-01-30 13:14:22 · 579 阅读 · 0 评论 -
计算几何学 | 投影 | Projection | C/C++实现
问题描述对于给定的三个点p1、p2、p,从点p向通过p1、p2的直线引一条垂线,求垂足x的坐标。(点p在直线p1p2上的投影)输入:输入按以下格式给出:xp1x_{p1}xp1 yp1y_{p1}yp1 xp2x_{p2}xp2 yp2y_{p2}yp2qqqxp0x_{p0}xp0 yp0y_{p0}yp0xp1x_{p1}xp1 yp1y_{p1}yp1…xp...原创 2019-02-15 22:42:34 · 2388 阅读 · 0 评论 -
连通分量 | Connected Components | C/C++实现
问题描述请编写一个程序,输入SNS的朋友关系,判断从指定人物出发能否通过双向朋友链抵达人物。输入: 第1行输入代表SNS用户数的整数n以及代表朋友关系数的m,用空格隔开。SNS各用户的ID分别为0到n-1。接下来的m行输入朋友关系,每个朋友关系占1行。1个朋友关系包含s、t这两个整数,表示s和t为朋友。s、t输入时用空格隔开。紧接下来的1行输入问题数q。再接下来的q行输入问题。各问题均为...原创 2019-01-29 22:43:19 · 1455 阅读 · 0 评论 -
广度优先搜索 | BFS | Breadth First Search | C/C++实现
问题描述请编写一个程序,求给定的有向图G(V,E)G(V, E)G(V,E)中顶点1到各顶点的最短路径d(路径边数的最小值)。各顶点编号分别为1至n。如果从顶点1出发无法到达某顶点,则与该顶点的距离记为-1。输入: 第1行输入G的顶点数n。接下来n行按如下格式输入各顶点u的邻接表。u k v1 v2 … vk其中u为顶点编号,k为u的度,v1 v2 … vk为与u相邻的顶点编号。输出: ...原创 2019-01-29 19:01:16 · 515 阅读 · 0 评论 -
拓扑排序 | Topological Sort | C/C++实现
问题描述有向无环图DAG可用来表示各种事物的顺序。比如以各项工作为顶点,用有向边来表示工作顺序。如果对这种表示顺序关系的DAG进行拓扑排序,我们便能得到一个恰当的工作顺序。对于一个有向无环图DAG,只要存在边(u, v),就让u在线性序列中位于v之前,这就是拓扑排序。请编写一个程序,输出对给定DAG G进行拓扑排序后的顶点顺序。输入:输入按照以下形式给出∣V∣|V|∣V∣ ∣E∣|E|∣...原创 2019-02-06 20:33:33 · 635 阅读 · 0 评论