美文网首页iOS学习笔记
n乘n的正方形网格,从左上角到右下角一共有多少种走法?

n乘n的正方形网格,从左上角到右下角一共有多少种走法?

作者: 无夜之星辰 | 来源:发表于2019-02-10 11:26 被阅读319次

背景

BOSS给我们出的寒假作业:

n乘n的正方形网格,从左上角到右下角,一共有多少种走法?要求只能向右或向下。

你或许很好奇卧槽你们BOSS干嘛没事出这种题?

BOSS曾经在IBM写过eclipse,虽然他现在是BOSS了,但内心还是程序猿,所以他会出这种题给我们做,也就不足为奇了。

BOSS说如果做出这道题,对一个人的思维逻辑会有所帮助,BOSS还说:

“你们尽管百度,百度出答案算我输。”

我的思路

我首先想到的是:一共要走2n步,其中向右n步,向下n步,只要确定了向右(或向下)的步伐,那么向下(或向右)的步伐也就一定确定了。

所以结果是:

然后验证了一下:

  • n=1,s=2;
  • n=2,s=6;
  • n=3,s=20

好像真的是这回事。

但是我觉得我那种直接得出公式的说法太牵强,并且验证的数据也太少,当n=4的时候,自己已经数不过来了。

不过,自己数,数不过来,那就让计算机帮我数。

从面向对象的角度看,这道题可以看作一个会分身的人从左上角往右下角走,每次走到岔路口(既可向右也可向下),开分身,分身向下,自身向右,分身走到岔路口同样开分身。每开一次分身说明多一条路。这个人和它的所有分身走完所有岔路结束。

程序设计思路

1.封装一个person类:

@interface Person : NSObject

// 当前所处的节点
@property (nonatomic, strong) Node *currentNode;

// 开分身
- (Person *)divide;

- (void)go;

@end

2.封装一个node(节点)类:

@interface Node : NSObject

// 行
@property (nonatomic, assign) NSInteger row;
// 最大行数
@property (nonatomic, assign) NSInteger maxRow;
// 列
@property (nonatomic, assign) NSInteger col;
// 最大列数
@property (nonatomic, assign) NSInteger maxCol;

// 有向右的分支
@property (nonatomic, assign) BOOL hasRightBranch;
// 有向下的分支
@property (nonatomic, assign) BOOL hasDownBranch;

@end

核心代码

- (void)go {
    if ([self.currentNode hasRightBranch] && [self.currentNode hasDownBranch]) {
        // 如果既能向右,又能向下,则开分身,每开一次分身就说明多一条路径
        Person *shadow = [self divide];
        
        // 路径数+1
        [[CountManager sharedManager] add];
       
        [shadow goDown]; // 分身向下
        [shadow go]; // 递归,接着走
        [self goRight]; // 自身向右
        [self go]; // 递归,接着走
    } else {
        // 没有岔路,说明已经走到边界,最右边或最下边,之后只有一条路走,没有选择
    }
}

- (void)goRight {
    // 向右走,列数+1
    self.currentNode.col ++;
}

- (void)goDown {
    // 向下走,行数+1
    self.currentNode.row ++;
}

验证

  • n=1,s=2;
  • n=2,s=6;
  • n=3,s=20;
  • n=4,s=70;
  • n=5,s=252;
  • n=6,s=924;
  • n=7,s=3432

验证了这么多组数据,都符合公式:

现在我坚信这就是问题的答案。

但是问题来了

我该如何向小伙伴阐述这个公式?

“因为一共要走2n步,其中向右n步,向下n步,确定一个方向的n步就确定了另一个方向的n步,所有公式就是这个。”

我这样一说,估计大家都懵逼。

我也懵逼。

应该是还有哪个点我没get到,希望有大佬能帮我指点迷津。

最后附上demo

https://github.com/CaiWanFeng/RouteDemo

相关文章

  • n乘n的正方形网格,从左上角到右下角一共有多少种走法?

    背景 BOSS给我们出的寒假作业: n乘n的正方形网格,从左上角到右下角,一共有多少种走法?要求只能向右或向下。 ...

  • Leetcode 精选之搜索(二进制矩阵中的最短路径)

    题目描述 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。 一条从左上角到右下角、...

  • 算法提高基础练习打卡(一)

    最低通行费 一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。 他要从网格的左上角进,右下角出。...

  • LeetCode 力扣 62. 不同路径

    题目描述(中等难度) 机器人从左上角走到右下角,只能向右或者向下走。输出总共有多少种走法。 解法一 递归 求 ( ...

  • 1600 - Patrol Robot

    大致题意:机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n)。...

  • 记录美团笔试_03/12

    Q1双行道:两行长度为n的字符串,‘.'表示可以通过,'X'表示不能通过,从左上角移动到右下角,一共有多少种方案:...

  • 1. n级台阶问题

    Q:n级台阶,每次只能上一级,或者两级。那么到第n级台阶一共有多少种走法。 思路:到第n级台阶的最后一步只有两种情...

  • 64. Minimum Path Sum

    题目 给定一个由非负数i填充的 m*n 网格,找到一条从左上角到右下角的路径,使得所有数字和最小。 解析 要求到 ...

  • 100天代码挑战:DAY8

    LeetCode 64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,...

  • ARTS第二周20200526

    Algorithm 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路...

网友评论

    本文标题:n乘n的正方形网格,从左上角到右下角一共有多少种走法?

    本文链接:https://www.haomeiwen.com/subject/bwedsqtx.html