def numPaths(warehouse):
MOD = 10**9 + 7
# Handle edge case for an empty grid
if not warehouse or not warehouse[0]:
return 0
n = len(warehouse)
m = len(warehouse[0])
# If the starting or ending cell is blocked, no path is possible
if warehouse[0][0] == 0 or warehouse[n-1][m-1] == 0:
return 0
# Create a 1D DP array to track paths for the current row
dp = [0] * m
dp[0] = 1 # Start position has 1 path
for i in range(n):
for j in range(m):
if warehouse[i][j] == 0:
# If the cell is blocked, ways to reach it drop to 0
dp[j] = 0
elif j > 0:
# dp[j] currently holds the value from the top cell (i-1, j)
# dp[j-1] holds the value from the left cell (i, j-1)
dp[j] = (dp[j] + dp[j-1]) % MOD
# The last element contains the paths to the bottom-right corner
return dp[m-1]
print(numPaths([[1,1,1,1],[1,1,1,1],[1,1,1,1]]))
ZGVmIG51bVBhdGhzKHdhcmVob3VzZSk6CiAgICBNT0QgPSAxMCoqOSArIDcKICAgIAogICAgIyBIYW5kbGUgZWRnZSBjYXNlIGZvciBhbiBlbXB0eSBncmlkCiAgICBpZiBub3Qgd2FyZWhvdXNlIG9yIG5vdCB3YXJlaG91c2VbMF06CiAgICAgICAgcmV0dXJuIDAKICAgICAgICAKICAgIG4gPSBsZW4od2FyZWhvdXNlKQogICAgbSA9IGxlbih3YXJlaG91c2VbMF0pCiAgICAKICAgICMgSWYgdGhlIHN0YXJ0aW5nIG9yIGVuZGluZyBjZWxsIGlzIGJsb2NrZWQsIG5vIHBhdGggaXMgcG9zc2libGUKICAgIGlmIHdhcmVob3VzZVswXVswXSA9PSAwIG9yIHdhcmVob3VzZVtuLTFdW20tMV0gPT0gMDoKICAgICAgICByZXR1cm4gMAogICAgICAgIAogICAgIyBDcmVhdGUgYSAxRCBEUCBhcnJheSB0byB0cmFjayBwYXRocyBmb3IgdGhlIGN1cnJlbnQgcm93CiAgICBkcCA9IFswXSAqIG0KICAgIGRwWzBdID0gMSAjIFN0YXJ0IHBvc2l0aW9uIGhhcyAxIHBhdGgKICAgIAogICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UobSk6CiAgICAgICAgICAgIGlmIHdhcmVob3VzZVtpXVtqXSA9PSAwOgogICAgICAgICAgICAgICAgIyBJZiB0aGUgY2VsbCBpcyBibG9ja2VkLCB3YXlzIHRvIHJlYWNoIGl0IGRyb3AgdG8gMAogICAgICAgICAgICAgICAgZHBbal0gPSAwCiAgICAgICAgICAgIGVsaWYgaiA+IDA6CiAgICAgICAgICAgICAgICAjIGRwW2pdIGN1cnJlbnRseSBob2xkcyB0aGUgdmFsdWUgZnJvbSB0aGUgdG9wIGNlbGwgKGktMSwgaikKICAgICAgICAgICAgICAgICMgZHBbai0xXSBob2xkcyB0aGUgdmFsdWUgZnJvbSB0aGUgbGVmdCBjZWxsIChpLCBqLTEpCiAgICAgICAgICAgICAgICBkcFtqXSA9IChkcFtqXSArIGRwW2otMV0pICUgTU9ECiAgICAgICAgICAgICAgICAKICAgICMgVGhlIGxhc3QgZWxlbWVudCBjb250YWlucyB0aGUgcGF0aHMgdG8gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIKICAgIHJldHVybiBkcFttLTFdCiAgICAKcHJpbnQobnVtUGF0aHMoW1sxLDEsMSwxXSxbMSwxLDEsMV0sWzEsMSwxLDFdXSkp