您的位置:首页 > 编程语言 > Java开发

【算法】矩阵走法问题

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 JAVA