【一道数学题】从(0,0)点经过(x,y)点到达(a,b)点的最短路径有多少条
2017-10-25 17:21
302 查看
如上图的题目,其中的A视为原点,X和B可以推广到任意坐标。计算代码如下:
public static void main(String[] args) { deal(4, 4, 2, 1); } /* * (maxX,maxY) 终点坐标 * (targetX,gargetY) 路经点坐标 */ public static void deal(int maxX, int maxY, int targetX, int targetY) { List<int[]> coords = new ArrayList<>(); // 保存每一步的结果集(路径) List<int[]> temp = new ArrayList<>(); // 保存每一步的起点集 coords.add(new int[] { 0, 0, 0 }); // 数组元素([0],[1])代表坐标;[2]为标记,0表示当前路径没有经过路经点,1表示当前路径经过路经点 for (int i = 0; i < maxX + maxY; i++) { // 可理解为从(0,0)点到(maxX,maxY)点,每次沿X或Y方向前进一步,一共需前进 maxX+maxY 步 temp.clear(); temp.addAll(coords); // 将上一步的结果集作为当前步的起点集 coords.clear(); for (int[] arr : temp) { // 遍历当前步的起点集 if (arr[0] == targetX && arr[1] == targetY) { arr[2] = 1; // 当前路径经过路经点,将标记更改为1 } if (arr[0] < maxX && arr[1] < maxY) { // X轴及Y轴方向均未到达目标位置,当前步可以在X轴或Y轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1], arr[2] }); coords.add(new int[] { arr[0], arr[1] + 1, arr[2] }); } else if (arr[0] < maxX) { // Y轴方向已到达目标位置,X轴方向未到达目标位置,当前步只能在X轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1], arr[2] }); } else if (arr[1] < maxY) { // X轴方向已到达目标位置,Y轴方向未到达目标位置,当前步只能在Y轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1], arr[2] }); } } } // coords为所有路径的集合,其中标记为1的路径经过路经点 int counter = 0; for (int[] arr : coords) { if (arr[2] == 1) { counter++; } } System.out.println("总路径:" + coords.size() + ",经过(" + targetX + "," + targetY + ")点:" + counter); }
事实上,从A经过X到达B的路径等价于A到X的路径和X到B的路径的组合,所以这个问题的本质是一个组合问题,即从原点到任意坐标的最短路程路径数。代码如下:
public static void main(String[] args) { System.out.println("总路径:" + deal(4, 4) + ",经过(" + 2 + "," + 1 + ")点:" + deal(2, 1) * deal(4 - 2, 4 - 1)); } /* * (maxX,maxY) 终点坐标 */ public static int deal(int maxX, int maxY) { List<int[]> coords = new ArrayList<>(); // 保存每一步的结果集(路径) List<int[]> temp = new ArrayList<>(); // 保存每一步的起点集 coords.add(new int[] { 0, 0}); for (int i = 0; i < maxX + maxY; i++) { temp.clear(); temp.addAll(coords); // 将上一步的结果集作为当前步的起点集 coords.clear(); for (int[] arr : temp) { if (arr[0] < maxX && arr[1] < maxY) { // X轴及Y轴方向均未到达目标位置,当前步可以在X轴或Y轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1]}); coords.add(new int[] { arr[0], arr[1] + 1}); } else if (arr[0] < maxX) { // Y轴方向已到达目标位置,X轴方向未到达目标位置,当前步只能在X轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1]}); } else if (arr[1] < maxY) { // X轴方向已到达目标位置,Y轴方向未到达目标位置,当前步只能在Y轴方向移动 coords.add(new int[] { arr[0] + 1, arr[1]}); } } } // coords为所有路径的集合 return coords.size(); }
相关文章推荐
- 每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
- 每天一道LeetCode-----找到有多少条连续路径的和为给定值,路径不需要从根节点出发到达叶子节点
- 在有向图中,判断某条边一定被两点的最短路径经过
- 街区最短路径问题 7 (数学 曼哈顿距离)
- POJ 3860 Fruit Weights(数学+最长路径 or 最短路径)
- [C++]学习从i结点到j结点最短路径共有多少条
- 前几天遇到一道有趣的题目 一座楼有10层,兔子可以跳跃的层数可以为1,2或者3,那么兔子到达10层有多少种跳法并列出各种情况。
- NYOJ 7 街区最短路径问题(数学问题)
- 最短路径问题平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。
- nyoj 7 街区最短路径问题 【数学】
- 求一共有多少种最短路径时
- 离散数学课本上的最短路径算法
- dijkstra最短路径及其输出(数学建模)
- poj 2186 Popular Cows 【有向图求SCC +缩点】【求图中有多少个点 可以由其余所有点通过存在路径到达】
- POJ3613 经过K条边的最短路径 矩阵乘法 + floyd
- 一个8*8的方格子,A点在左下角,B点在右上角,求A点到B点的最短路径有多少条
- 100盏灯经过一系列操作后最后还有多少盏灯亮着(百度的一道笔试题)
- 关于经过若干指定节点最短路径问题的算法。
- hdu2083简易版最短路径。。简单数学题