矩阵走法问题

腾讯2013笔试题



首先我们研究从A到B有多少种走法,定义f(x,y),其中x为A到B横向走的格数,y为A到B纵向走的格数,则A到B有f(x,y)中走法,不难看出

f(x,y)=f(x-1,y)+f(x,y-1)

因此f(x,y)问题可以用递归算法来做,其中

递归公式为:f(x,y)=f(x-1,y)+f(x,y-1)
边界条件为:f(x,0)=f(0,y)=1


而问题求的是不经过点p的路径数,A到B的路径数为f(7,5),A到P的路径数为f(3,3),P到B的路径数为f(4,2),因此解为f(7,5)-f(3,3)*f(4,2)


1.程序实现代码:
#include <iostream>
using namespace std;

int f(int x,int y)
{
    if(x==0||y==0)
        return 1;
    else
        return f(x,y-1)+f(x-1,y);
}
int main()
{
   cout<<f(7,5)-f(3,3)*f(4,2)<<endl;
}


运行结果:
492

2.当然本题是个选择题,暂且想到的方法是用这个递归式分步求解,计算也稍微有点繁琐,其中f(x,1)=f(x,0)+f(x-1,1)=x+1,利用这个特性可以减少不少计算量。


由于最近看了下python,练习一下python编程,想到用python枚举一下f(1,1)到f(10,10)
def f(x,y):
	if x==0 or y==0:
		return 1
	return f(x,y-1)+f(x-1,y)
from f import f
for x in range(1,11):
    for y in range(1,11):
        print '(',x,',',y,'):',f(x,y) 
运行结果:
( 1 , 1 ): 2
( 1 , 2 ): 3
( 1 , 3 ): 4
( 1 , 4 ): 5
( 1 , 5 ): 6
( 1 , 6 ): 7
( 1 , 7 ): 8
( 1 , 8 ): 9
( 1 , 9 ): 10
( 1 , 10 ): 11
( 2 , 1 ): 3
( 2 , 2 ): 6
( 2 , 3 ): 10
( 2 , 4 ): 15
( 2 , 5 ): 21
( 2 , 6 ): 28
( 2 , 7 ): 36
( 2 , 8 ): 45
( 2 , 9 ): 55
( 2 , 10 ): 66
( 3 , 1 ): 4
( 3 , 2 ): 10
( 3 , 3 ): 20
( 3 , 4 ): 35
( 3 , 5 ): 56
( 3 , 6 ): 84
( 3 , 7 ): 120
( 3 , 8 ): 165
( 3 , 9 ): 220
( 3 , 10 ): 286
( 4 , 1 ): 5
( 4 , 2 ): 15
( 4 , 3 ): 35
( 4 , 4 ): 70
( 4 , 5 ): 126
( 4 , 6 ): 210
( 4 , 7 ): 330
( 4 , 8 ): 495
( 4 , 9 ): 715
( 4 , 10 ): 1001
( 5 , 1 ): 6
( 5 , 2 ): 21
( 5 , 3 ): 56
( 5 , 4 ): 126
( 5 , 5 ): 252
( 5 , 6 ): 462
( 5 , 7 ): 792
( 5 , 8 ): 1287
( 5 , 9 ): 2002
( 5 , 10 ): 3003
( 6 , 1 ): 7
( 6 , 2 ): 28
( 6 , 3 ): 84
( 6 , 4 ): 210
( 6 , 5 ): 462
( 6 , 6 ): 924
( 6 , 7 ): 1716
( 6 , 8 ): 3003
( 6 , 9 ): 5005
( 6 , 10 ): 8008
( 7 , 1 ): 8
( 7 , 2 ): 36
( 7 , 3 ): 120
( 7 , 4 ): 330
( 7 , 5 ): 792
( 7 , 6 ): 1716
( 7 , 7 ): 3432
( 7 , 8 ): 6435
( 7 , 9 ): 11440
( 7 , 10 ): 19448
( 8 , 1 ): 9
( 8 , 2 ): 45
( 8 , 3 ): 165
( 8 , 4 ): 495
( 8 , 5 ): 1287
( 8 , 6 ): 3003
( 8 , 7 ): 6435
( 8 , 8 ): 12870
( 8 , 9 ): 24310
( 8 , 10 ): 43758
( 9 , 1 ): 10
( 9 , 2 ): 55
( 9 , 3 ): 220
( 9 , 4 ): 715
( 9 , 5 ): 2002
( 9 , 6 ): 5005
( 9 , 7 ): 11440
( 9 , 8 ): 24310
( 9 , 9 ): 48620
( 9 , 10 ): 92378
( 10 , 1 ): 11
( 10 , 2 ): 66
( 10 , 3 ): 286
( 10 , 4 ): 1001
( 10 , 5 ): 3003
( 10 , 6 ): 8008
( 10 , 7 ): 19448
( 10 , 8 ): 43758
( 10 , 9 ): 92378
( 10 , 10 ): 184756





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值