【算法】矩阵走法问题
2016-02-08 23:15
513 查看
问题:一个m*n矩阵,从角走到对角不走多余的路一共有多少种走法?
算法:
1.如果用A和B来表示每一步的话,因为步数一定,而AB可以任意组合,所以这是个排列组合的问题,m+n的全排列除以m和n的全排列就可以了。
2.按照递推的思路,假设从左上角走到右下角,当前格子的走法是左边的走法加上面的走法,所以遍历递推一遍就可以了。
代码:
1.g(n,m)=(m+n)!/(m!*n!)
2如下:(伪代码)
main(){
g(m,n);//这里是从m*n的格子的边上走
}
private static int g(int m, int n) {
int h[][]=new int[m+1][n+1];
S_Init(h,0);//初始化为0
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++){
if(i>0&&j>0){
h[j][i]=h[j-1][i]+h[j][i-1];
}
}else{
h[j][i]=1;
}
}
return h[m]
;
}
一些思考:
A..如果不允许经过其中的一个点P(萌P鸽了),一共有多少总走法?
按照思路1,直接减去到达P点的组合数即可,g'(m,n)=g(m,n)-g(pm,pn)*g((m-pm),(n,pn))。
按照思路2,修改一下返回值就可以了,大体上和这个方法相同
http://www.mamicode.com/info-detail-1005851.html
B.如果在某一个方向上,允许往反方向走,但不允许走重复的路,一共有多少总走法?
比较有意思的一个结果,答案是n^(m-1)(或m^(n-1))
对于每一个点,把来自不同方向的路径分别考虑,在纸上写一下递推,很容易得到这个结果。
http://tieba.baidu.com/p/2455136622
算法:
1.如果用A和B来表示每一步的话,因为步数一定,而AB可以任意组合,所以这是个排列组合的问题,m+n的全排列除以m和n的全排列就可以了。
2.按照递推的思路,假设从左上角走到右下角,当前格子的走法是左边的走法加上面的走法,所以遍历递推一遍就可以了。
代码:
1.g(n,m)=(m+n)!/(m!*n!)
2如下:(伪代码)
main(){
g(m,n);//这里是从m*n的格子的边上走
}
private static int g(int m, int n) {
int h[][]=new int[m+1][n+1];
S_Init(h,0);//初始化为0
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++){
if(i>0&&j>0){
h[j][i]=h[j-1][i]+h[j][i-1];
}
}else{
h[j][i]=1;
}
}
return h[m]
;
}
一些思考:
A..如果不允许经过其中的一个点P(萌P鸽了),一共有多少总走法?
按照思路1,直接减去到达P点的组合数即可,g'(m,n)=g(m,n)-g(pm,pn)*g((m-pm),(n,pn))。
按照思路2,修改一下返回值就可以了,大体上和这个方法相同
http://www.mamicode.com/info-detail-1005851.html
B.如果在某一个方向上,允许往反方向走,但不允许走重复的路,一共有多少总走法?
比较有意思的一个结果,答案是n^(m-1)(或m^(n-1))
对于每一个点,把来自不同方向的路径分别考虑,在纸上写一下递推,很容易得到这个结果。
http://tieba.baidu.com/p/2455136622
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树