最短路
原题
如下图所示, 是一个无向图,其中蓝色边的长度是 、橘色边的长度是 、绿色边的长度是 。
则从 到 的最短距离是多少?
分析
本题考查图的遍历,本题使用深度优先(DFS)遍历指定起点和终点的路径,最终即可求出最短路径。
首先是对图中各个结点及其相互之间的通路进行录入,这里使用一个元组(a,b,p)表示两个结点之间的路,其中a, b, p分别表示结点a、结点b、两点之间的路径长度。
这里起点为结点A,终点为结点S,进行深度优先遍历:从点A出发,然后选择一个与A相邻顶点b(这里的b为B, C, D, E)进行访问并记录当前路径长度,再从b出发选择一个与b相邻顶点进行访问,依次继续,直到访问到终点。
源码
蛇形填数
原题
如下图所示,小明用从 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是 。请你计算矩阵中第 行第 列的数是多少?
“暴力枚举”编程实现
所谓蛇形填数,就是矩阵中的数按照从小到大的次序用线连接后是一个“蛇形图案”。
从数字1(第1行第1列)开始,设每个数字的位置用行索引、列索引的方式表示,即(row, col)。控制连线的方向的操作可以细分为以下四步:
① 斜向下连线的准备:行索引不变,列索引加1;如数字1到数字2,数字6到7,......
② 斜向下连线:行索引加1,列索引减1,直到列索引变为1;如数字2、3,数字7、8、9、10,......
③ 斜向上连线的准备:行索引加1,列索引不变;如数字3到数字4,数字10到11,......
④ 斜向上连线:行索引减1,列索引加1,直到行索引变为1;如数字4、5、6,数字11、12、13、14、15,......
具体实现见如下代码。
找规律
以上“暴力枚举” 实现较繁琐,且效率较低,在比赛中遇到这种类型的填空题一般可以找到其数字规律,以上实现仅供有兴趣的朋友了解参考。
针对本题的第矩阵中第20行第20列的数字,行、列索引相等的数字位于对角线上,可以找找矩阵中对角线的数字的规律,然后求解。
1,5,13,25,...n是为第i行第i列的元素(i=1,2,3,4,...,n),即对角线上的元素。
其数字规律的表达式可能不止一种,看个人的找规律方法,比赛中遇到这种类型题需要参赛者对数字排列有一定的敏感性。以下是其两种表达式(递归式和普通公式)。