走格子/棋盘问题 有多少条路径可走
2013-10-19 21:15
393 查看
选择题:在如下8*6的矩阵中,请计算从A移动到B一共有多少走法?要求每次只能向上或向右移动一格,并且不能经过P。()
A 492 B 494 C 496 D 498
看一次忘一次,决定这次再次理解一便,并更加形象的理解:
试想:
题目若是m*n表格里面,从A到B,不管其如何走,必然要经过m+n个格子(这个就不需要证明了吧)。然后这m+n个格子里面只有两种状态,向上或向右;而且为到达B,必须有n个向右走,m个向上走;如此,从这m+n个格子里选择n个向右走就ok了(剩下的就向上走,当然可以选择m向上走,剩下向右走)。这样可能会比原解释的要更加清楚些~
其他的,参考原解释:
附原解释:
解答:
这是有关组合数学中排列组合的一道题。
从n个元素中任取r个元素一组,若不考虑它们的顺序时,则称为从n中取r的组合,它的方案数以C(n,r) 表示;
从n个元素中任取r个元素按顺序排成一列,则称为从n中取r的排列,其排列的方案数以p(n,r) 表示。
这道题等同于下面的一道题:
许多街道都建成方格形。从家中出发到目的地,向东要走m条街,想北要走n条街,试问从家中到工作地点最短路径有几条?
若将家作为 (0,0)点,工作地点作为(m,n)点,问题就化为从(0,0)点到(m,n)点有几条最短路径(如下图)
从(0,0)点到(m,n)点走的路径,必然是向x轴方向过m次街道,y轴方道路向过n个街道。即每条道路和由m个x和n个y构成的共m+n的排列一一对应,可以看成在m+n个格中
选m个格子,填上x,剩下的n个格子填上y,这样的排列数为c(m+n,m),同理,这样的排列数为c(m+n,n)。
现在我们来解决拿到面试题:
每个方格看做一个点,得到下面坐标图:
首先从A到B总共有c(7+5,5)种走法,从A到P有c(3+3,3)种走法,从P到B有c(4+2,2)种走法。
所以不经过点P得走法共有c(12,5)-(c(6,3)*c(6,2))种,即492种,选A。
给定一个m*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)。
解答:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0=<i,j<=n,我们即求f(n,n)这样我们就可以递归的定义子问题
f(n,n)=f(n-1,n)+f(n,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解,非递归解。
1,给定一个n*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)
解答:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0=<i,j<=n,我们即求f(n,n)这样我们就可以递归的定义子问题
f(n,n)=f(n-1,n)+f(n,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解,非递归解。
2,给定一个m*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)
解答:这个问题和第1题的解答是类似的。只不过最终求的是f(m,n)=f(m-1,n)+f(m,n-1),初始为f(0,0)=0,f(0,1)=1,f(1,0)=1,所以两个解法的通用方案为:
/*
走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左下角走到右上角的走法总数。
递归解
*/
int solve_cube_work(int m,int n){
if(m==0 && n==0)
return 0;
if(m==1 && n==0)
return 1;
if(m==0 && n==1)
return 1;
if(m==0)
return solve_cube_work(m,n-1);
if(n==0)
return solve_cube_work(m-1,n);
return solve_cube_work(m-1,n)+solve_cube_work(m,n-1);
}
/*
走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左下角走到右上角的走法总数。
非递归解
*/
int solve_cube_work_iter(int m,int n){
int **Q=new int*[m+1];
for(int i=0;i<=m;i++){
Q[i]=new int[n+1]();
}
//初始化
Q[0][0]=0;
for(int j=1;j<=n;j++)
Q[0][j]=1;
for(int i=1;i<=m;i++)
Q[i][0]=1;
//迭代计算
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
Q[i][j]=Q[i-1][j]+Q[i][j-1];
}
}
int res=Q[m]
;
delete [] Q;
return res;
}
B | |||||||
P | |||||||
A |
看一次忘一次,决定这次再次理解一便,并更加形象的理解:
试想:
题目若是m*n表格里面,从A到B,不管其如何走,必然要经过m+n个格子(这个就不需要证明了吧)。然后这m+n个格子里面只有两种状态,向上或向右;而且为到达B,必须有n个向右走,m个向上走;如此,从这m+n个格子里选择n个向右走就ok了(剩下的就向上走,当然可以选择m向上走,剩下向右走)。这样可能会比原解释的要更加清楚些~
其他的,参考原解释:
附原解释:
解答:
这是有关组合数学中排列组合的一道题。
从n个元素中任取r个元素一组,若不考虑它们的顺序时,则称为从n中取r的组合,它的方案数以C(n,r) 表示;
从n个元素中任取r个元素按顺序排成一列,则称为从n中取r的排列,其排列的方案数以p(n,r) 表示。
这道题等同于下面的一道题:
许多街道都建成方格形。从家中出发到目的地,向东要走m条街,想北要走n条街,试问从家中到工作地点最短路径有几条?
若将家作为 (0,0)点,工作地点作为(m,n)点,问题就化为从(0,0)点到(m,n)点有几条最短路径(如下图)
从(0,0)点到(m,n)点走的路径,必然是向x轴方向过m次街道,y轴方道路向过n个街道。即每条道路和由m个x和n个y构成的共m+n的排列一一对应,可以看成在m+n个格中
选m个格子,填上x,剩下的n个格子填上y,这样的排列数为c(m+n,m),同理,这样的排列数为c(m+n,n)。
现在我们来解决拿到面试题:
每个方格看做一个点,得到下面坐标图:
首先从A到B总共有c(7+5,5)种走法,从A到P有c(3+3,3)种走法,从P到B有c(4+2,2)种走法。
所以不经过点P得走法共有c(12,5)-(c(6,3)*c(6,2))种,即492种,选A。
给定一个m*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)。
解答:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0=<i,j<=n,我们即求f(n,n)这样我们就可以递归的定义子问题
f(n,n)=f(n-1,n)+f(n,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解,非递归解。
1,给定一个n*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)
解答:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(n,n)(坐标系的单位长度为小方格的变长)
f(n,n)=f(n-1,n)+f(n,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解,非递归解。
2,给定一个m*n的格子或棋盘,问从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)
解答:这个问题和第1题的解答是类似的。只不过最终求的是f(m,n)=f(m-1,n)+f(m,n-1),初始为f(0,0)=0,f(0,1)=1,f(1,0)=1,所以两个解法的通用方案为:
/*
走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左下角走到右上角的走法总数。
递归解
*/
int solve_cube_work(int m,int n){
if(m==0 && n==0)
return 0;
if(m==1 && n==0)
return 1;
if(m==0 && n==1)
return 1;
if(m==0)
return solve_cube_work(m,n-1);
if(n==0)
return solve_cube_work(m-1,n);
return solve_cube_work(m-1,n)+solve_cube_work(m,n-1);
}
/*
走方格问题,给定一个m*n的小方格子组成的棋盘,问从棋盘左下角走到右上角的走法总数。
非递归解
*/
int solve_cube_work_iter(int m,int n){
int **Q=new int*[m+1];
for(int i=0;i<=m;i++){
Q[i]=new int[n+1]();
}
//初始化
Q[0][0]=0;
for(int j=1;j<=n;j++)
Q[0][j]=1;
for(int i=1;i<=m;i++)
Q[i][0]=1;
//迭代计算
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
Q[i][j]=Q[i-1][j]+Q[i][j-1];
}
}
int res=Q[m]
;
delete [] Q;
return res;
}
相关文章推荐
- 2.算法:棋盘路径问题。走格子/棋盘问题 有多少条路径可走
- (2014阿里巴巴校园招聘)关于格子路径问题
- 求格子中的最短路径条数问题
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- 棋盘左上角到右下角路径最大值问题
- 阿里2016笔试题-棋盘问题 求路径的种数
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- 走格子/棋盘问题
- 例题:for循环迭代法。一个棋盘有n个格子,第一个格子有一粒米,第二个格子有两粒米,第三个格子有四粒米,依次类推,第n个格子里有多少粒米,棋盘里一共有多少粒米。
- 走格子/走棋盘问题
- 中过象棋棋盘一半 马踏日 从(1,1)出发只能向右踏出,到(m,n)有多少路径
- 给定一个8*8的方格子,A点到B点的最短路径有多少条?
- 搜狗笔试题目:4*5的棋盘,在左下角的格子移动到右上角的格子,求有多少种移动方法
- 图论, 1.各种方案的最短路径,最小生成树,拓扑排序, 2.隐式图的搜索,N-皇后问题,数独,马踏棋盘,中文划分,回文划分.
- 一个8*8的方格子,A点在左下角,B点在右上角,求A点到B点的最短路径有多少条
- 格子路径问题
- 图论, 1.各种方案的最短路径,最小生成树,拓扑排序, 2.隐式图的搜索,N-皇后问题,数独,马踏棋盘,中文划分,回文划分.
- 格子路径问题
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)