面试:机器人走方格

机器人走方格

  • 也是一个面试题目,考察的还挺多的。
  • 题目大意:M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法。
  • 要是有点动态规划的基础,可能会写下一个简单的二维dp。设矩阵dp[i][j]表示的是走到ij这个格子的走法数量,那他应该等于dp[i-1][j]+dp[i][j+1],因为每个机器人就是只能走右或者下。
  • 如果这个方法不是很理解,没有动态规划的基础。也ok。
    我们把每个方格里都写上步数,看看有没有规律。
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
  • 如果对杨辉三角有点印象,也能感觉出来了。杨辉三角是怎么求得呢。hhh,如果还没感觉,再看
  • 如果把向右走标记为1, 向下走标记为0。按照这个表格,我们可以写下来从左上角走到右下角这样的路线
  • 111000/101010/110010/100011等等,可以看出来规律了吧~,就是如果是n行m列,我们想从左上角走到右下角,一定要向右走m次, 向下走n次,其中的顺序可以随便。这就是排列组合中的组合啦。(n+m)个元素了取n个或者m个,就是C。ok啦。
  • 原理就这样啦,附上代码以及题目链接,赶紧AC了吧~
const int mod = 1000000000 + 7;
int a[1000 + 10][1000+ 10];
int main()
{
    int n, m;
    cin>>n>>m;
    for(int i = 1; i<= n; i++){
        for(int j = 1; j <= m; j++){
            if(i == 1||j == 1){
                a[i][j] = 1;
                continue;
            }
            a[i][j] = (a[i-1][j] + a[i][j-1])%mod;
        }
    }
    cout<<a[n][m];
    return 0;
 }
  • 面试时候只写了dp的那个。后面的只说了思路,在求解排列组合时候需要借助逆元之类的,没兴趣可以不了解啦~~知道思路更重要些,链接里面用dp简单一些,要是用排列组合,求解逆元之类的麻烦啦~

题目是有提交的地址,机器人走方格

祝你成功~

猜你喜欢

转载自www.cnblogs.com/leon-ldy/p/12347692.html