2.算法:棋盘路径问题。走格子/棋盘问题 有多少条路径可走
2017-05-15 01:02
2106 查看
1.问题描述
给定一个m*n的格子或棋盘,问从左上角走到右下角的走法总数(每次只能向右或向下移动一个方格边长的距离。
2.基本要求
期盼路径算法,走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左上角走到右下角的走法总数。
要求:只能向右走或者向下走。求出从左上到右下的路径数。
如图一所示,是一个棋盘,要求从start开始到end结束的路径数。
3.算法思想:递归
不过最终求的是f(m,n)=f(m-1,n)+f(m,n-1),初始为f(0,0)=0,f(0,1)=1,f(1,0)=1。
4.主要代码
5.时间复杂度分析
我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0<=i,j<=N, f(m,n)=f(m-1,n)+f(m,n-1),初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解。
6.图解
如图所示,为空间复杂度分析。
给定一个m*n的格子或棋盘,问从左上角走到右下角的走法总数(每次只能向右或向下移动一个方格边长的距离。
2.基本要求
期盼路径算法,走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左上角走到右下角的走法总数。
要求:只能向右走或者向下走。求出从左上到右下的路径数。
如图一所示,是一个棋盘,要求从start开始到end结束的路径数。
3.算法思想:递归
不过最终求的是f(m,n)=f(m-1,n)+f(m,n-1),初始为f(0,0)=0,f(0,1)=1,f(1,0)=1。
4.主要代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> int cube(int m,int n) { if (m > 1 && n > 1) { return cube(m, n - 1) + cube(m - 1, n); } else if ((m == 0) && (n>1)) { return cube(m,n-1); } else if ((n == 0) && (m>1)) { return cube(m-1,n); } else if ((m == 0 && n == 1) || (m == 1 && n == 0)) { return 1; } else return 0; } int main() { printf("%d",cube(9,8)); system("PAUSE"); }
5.时间复杂度分析
我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0<=i,j<=N, f(m,n)=f(m-1,n)+f(m,n-1),初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解。
6.图解
如图所示,为空间复杂度分析。
相关文章推荐
- 走格子/棋盘问题 有多少条路径可走
- 最短路径问题的算法实现【转载】
- Java解决算法-最短路径问题
- 开开心心学算法--街区最短路径问题的二种解法
- 最短路径的几种算法的路径问题(floy , dij , spfa)
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 分治算法之 棋盘覆盖问题(完整代码实现)
- 最大流问题:增广路径算法的比较
- 最大流问题:增广路径算法的比较
- 物流配送路径优化问题分析与算法解读(一)
- 棋盘覆盖问题的算法实现
- 走格子/棋盘问题
- HDOJ 3970 最短路径问题[Dijsktra算法的应用]
- Floyd-算法的最短路径保存问题
- 最短路径算法之AStar算法(二) A Star算法需要注意的问题
- 关于棋盘马走“日”字问题的回溯算法实现
- 棋盘覆盖问题的算法实现
- 最短路径问题(算法模板)
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法