腾讯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