📜  门| GATE-CS-2006 |第67章(1)

📅  最后修改于: 2023-12-03 15:12:41.575000             🧑  作者: Mango

门 | GATE-CS-2006 | 第67章

简介

本文介绍了GATE-CS-2006的题目,主题为“门”,属于第67章。

题目描述

一排门编号为1到n,其中有k扇门是关闭的,编号分别为i1,i2...ik。从门1出发,每次可以向右走x步,如果遇到关闭的门则必须停下,否则可以直接通过。求1到n之间有多少条不需要停下的路径。

思路

通过数学公式推导,可以得到步长为x时,能走到的门的编号为:1, x+1, 2x+1, 3x+1, … 当有一扇门是关闭的时候,路径就被限制住了,需要从该门前的一扇门重新开始走,假设这扇门的编号为m,显然m = (i - 1) / x * x + 1,其中i为关闭的门的编号。

因此,我们可以计算出每扇关闭的门前的一扇门的编号,分别为:1, m1, m2, …, mk。则第i个数到第i+1个数之间的路径数为:路径数(i, i+1) = 走到mi-1门的路径数 - 走到m(i-1)-1门的路径数。

最终,我们得到的就是从门1到门n之间不需要停下的路径数。

代码
def calculate_paths(n: int, k: int, closed_doors: List[int], x: int) -> int:
    paths = [0] * (n + 1)
    paths[1] = 1

    for i in range(2, n + 1):
        paths[i] = paths[i - 1] if (i - 1) not in closed_doors else 0
        for j in range(2, x + 1):
            if i - j > 0 and (i - j) not in closed_doors:
                paths[i] += paths[i - j]
    
    for door in closed_doors:
        m = (door - 1) // x * x + 1
        paths[door] = paths[m - 1] - paths[max(m - 1 - x, 0)]

    return paths[n]
参考