腾讯的笔试题一道

 

搜罗了一些腾讯的笔试题目 

 
题目是这样的:
 

 在如下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。排列组合  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点有多少种走法呢?

 

posted @ 2012-09-01 21:17  pipicfan  阅读(308)  评论(0编辑  收藏  举报