搜罗了一些腾讯的笔试题目
题目是这样的:
在如下8*6的矩阵中,请计算从A移动到B一共有多少种走法?要求每次只能向上挥着向右移动一格,并且不能经过P;
|
|
|
|
|
|
|
B |
|
|
|
|
|
|
|
|
|
|
|
P |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
|
|
|
|
A)492
B)494
C)496
D)498
下面是博兄的思路,很给力。
倒数1 1 = 1
倒数第2列 1+1+1+1+1= 5
倒数第三列 5+4+3+2+1= 15
这道题目完全可以这么理解 如果翻转一下你会发现
p点先忽略
发现什么了 ?
只要 到了最后一排就相当于接触到了b
所以 根据题意
倒数1 1 = 1
倒数2 1+1+1+1+1= 5
倒数3 5+4+3+2+1= 15
倒数4 15+10+6+3+1= 35
倒数5 35+20+10+4+1=70
倒数6 70+35+15+5+1=126
倒数7 126+56+21+6+1=210
倒数8 210+84+28+7+1=330
全部相加 1+5+15+35+70+126+210+330=792
根据题意从A到B一共有792种走法
减去经过P的就是要求的那部分
经过p的
可以根据倒数排数推出 从p点出发一共有15种走法
然后 由图中可以分析出 能够到达p点的路径有20种
15*20=300
这就是经过p点所有路径
那么 792-300=492
倒数2 1+1+1+1+1= 5
倒数3 5+4+3+2+1= 15
倒数4 15+10+6+3+1= 35
倒数5 35+20+10+4+1=70
倒数6 70+35+15+5+1=126
倒数7 126+56+21+6+1=210
倒数8 210+84+28+7+1=330
全部相加 1+5+15+35+70+126+210+330=792
根据题意从A到B一共有792种走法
减去经过P的就是要求的那部分
经过p的
可以根据倒数排数推出 从p点出发一共有15种走法
然后 由图中可以分析出 能够到达p点的路径有20种
15*20=300
这就是经过p点所有路径
那么 792-300=492
2。排列组合 C(12,7) - C(6,4)*C(6,3) = 492;
初看这个式子感觉看不太懂,稍微提示下,a点到b一点不论怎么走都要走12步,其中行必须走7步,列必须走5步。
C(12,7) = C(12,5);
3.递归程序解法
下面我用程序进行验证。
// shuju.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; int numcout = 0; #define px 2 //p点的x,y坐标 #define py 3 void fun(int m,int n) { if(m==0 &&n==7) { numcout++; return; } //进行判断去除p点位于数组的2,3位置 if(m==px&&n==py-1) { m = m-1; } if(m==px+1&&n==py) { n = n+1; } if(m>=0 ) { fun(m-1,n); } if(n<=6) { fun(m,n+1); } } int main(int argc, char* argv[]) { fun(5,0); cout<<numcout; return 0; }
思考,假如这道题规定按对角线斜着也能走,那们a点到b点有多少种走法呢?