我不知道如何开始。
让我们想象一个 5x5 的正方形。
机器人从左上角开始,然后在右下角开始。
我们想让一个机器人从左上角的开始方块到右下角的结束方块。
在每个方格,机器人只有两个动作之一:
它可能向右走一格,也可能向下一格。
编写一个程序来确定有多少种方法可以做到这一点?换句话说,从“开始”到“结束”有多少条路径,每一步的移动都像上面那样受到限制?
我不知道如何开始。
让我们想象一个 5x5 的正方形。
机器人从左上角开始,然后在右下角开始。
我们想让一个机器人从左上角的开始方块到右下角的结束方块。
在每个方格,机器人只有两个动作之一:
它可能向右走一格,也可能向下一格。
编写一个程序来确定有多少种方法可以做到这一点?换句话说,从“开始”到“结束”有多少条路径,每一步的移动都像上面那样受到限制?
这由递归树遍历表示。您可以编写一个递归方法来执行此操作,例如:
traverse_moves,获取棋盘状态(在本例中为机器人所在的位置)并返回一个整数
计算你可以采取的下一步行动 - 从 0 到 2 总数。如果为 0,则返回整数1
。如果为 1 或 2,则为每个有效移动创建棋盘状态并使用您创建的状态调用此方法,将所有调用的返回值相加并返回您得到的总和。
例如,对于 2x2 板,创建机器人位于左上角的状态。这个状态有两种可能的移动,所以它会用机器人左下角和机器人右上角来调用自己。这些状态中的每一个都有一个可能的移动,并且会用右下角的机器人来称呼自己。遍历树的这两个“叶子”都将返回 1,这些 1 将被返回并传播并总结递归,从而为您提供 2 作为正确答案。
Caller
| 2
TL calls itself with BL and TR
/ 1 \ 1
BL TR call themselves with BR, their only valid move
| 1 | 1
BR BR return 1s each for being leaf nodes, the 1s are returned and summed
编辑:伪代码
int traverseMoves(BoardState state)
{
List<BoardState> nextMoves = possibleMovesFrom(state);
if (nextMoves.Length == 0)
{
return 1;
}
int returnValue = 0;
foreach (BoardState move in nextMoves)
{
returnValue += traverseMoves(move);
}
return returnValue;
}