给定n×m个方格构成的图,每个格子都有一种地形:
- 有一些格子是墙,以符号
#
表示,墙不可通行。 - 有一些格子是空地,以符号
.
表示,空地可以通行。
请统计从左上角的方格出发,有多少种不同的路线可以以最短距离走到右下角。在行走过程中,不能进入地形为墙的方格,保证起点与终点方格地形不是墙。且行走时,只能移动到水平或垂直方向相邻的方格。
由于方案数可能很大,输出模 1,000,000,007 的余数。
输入格式
- 第一行:单个整数 n 与 m
- 第二行到第 n+1 行:第 i+1 行每行有 m 个整数表示第 i 行的地形
输出格式
- 单个整数:表示路线方案模 1,000,000,007 的余数。
数据范围
- 30% 的数据,1≤n,m≤4
- 60% 的数据,1≤n,m≤10
- 100% 的数据,1≤n,m≤1000
样例数据
输入:
3 3
...
.#.
...
输出:
2
思路:使用动态规划
ACcode
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
int main()
{
int n, m;
cin >> n >> m;
vector<vector<char>> grid(n, vector<char>(m));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cin >> grid[i][j];
}
}
vector<vector<int>> dp(n, vector<int>(m, 0));
dp[0][0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(grid[i][j] == '#')
{
continue;
}
if(i > 0)
{
dp[i][j] += dp[i - 1][j];
dp[i][j] %= MOD;
}
if(j > 0)
{
dp[i][j] += dp[i][j - 1];
dp[i][j] %= MOD;
}
}
}
cout << dp[n - 1][m - 1];
return 0;
}