Problem:
Score : 100 points

Problem Statement

There is a grid with H horizontal rows and W vertical columns.
Let (i, j) denote the square at the i-th row from the top and the j-th column from the left.

For each i and j (1 \leq i \leq H, 1 \leq j \leq W), Square (i, j) is described by a character a_{i, j}.
If a_{i, j} is ., Square (i, j) is an empty square; if a_{i, j} is #, Square (i, j) is a wall square.
It is guaranteed that Squares (1, 1) and (H, W) are empty squares.

Taro will start from Square (1, 1) and reach (H, W) by repeatedly moving right or down to an adjacent empty square.

Find the number of Taro's paths from Square (1, 1) to (H, W).
As the answer can be extremely large, find the count modulo 10^9 + 7.

Constraints

H and W are integers.

2 \leq H, W \leq 1000

a_{i, j} is . or #.

Squares (1, 1) and (H, W) are empty squares.

Input

Input is given from Standard Input in the following format:

H W
a_{1, 1}\ldotsa_{1, W}
:
a_{H, 1}\ldotsa_{H, W}

Output

Print the number of Taro's paths from Square (1, 1) to (H, W), modulo 10^9 + 7.

Sample Input 1

3 4
...#
.#..
....

Sample Output 1

3

There are three paths as follows:

Sample Input 2

5 2
..
#.
..
.#
..

Sample Output 2

0

There may be no paths.

Sample Input 3

5 5
..#..
.....
#...#
.....
..#..

Sample Output 3

24

Sample Input 4

20 20
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................

Sample Output 4

345263555

Be sure to print the count modulo 10^9 + 7.

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include <iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string> 
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
const int N=1e3+5;
bool vis[N][N];
int dir[2][2] = {1,0,0,1}; 
int cnt[N][N];
queue<pii>q;
int main()
{
    int n,m;
    cin>>n>>m;//n行m列 
    vector<string> g(n);//图 
    for(int i=0;i<n;i++)
      cin>>g[i];
    q.push({0,0});//起点为0,0，入队 
    vis[0][0]=1;//标记为已访问 
    cnt[0][0]=1;//起点到起点的路径条数为1 
    while (!q.empty())
    {
        pii f=q.front();
        q.pop();//取队首元素 
        for(int i=0;i<2;i++)//这里要注意，只往下走或者往右走(题目要求) 
        {
            int x=f.first+dir[i][0],y=f.second+dir[i][1];
            if (x>=0&&x<n&&y>=0&&y<m&&g[x][y]== '.')//边界条件以及障碍物条件 
            {
                cnt[x][y]=(cnt[f.first][f.second]+cnt[x][y])%mod;//到x，y点的路径条数为其他路径条数(cnt[x][y])+当前路径条数cnt[f.first][f.second] 
                if(!vis[x][y])//如果没有访问过该点 
                {
                    vis[x][y]=1;//标记为已访问 
                    q.push({x,y});//将其加入队列以更新其其他可达点的cnt值
                	//因为只有向右和向下两个行走方向，所以队列中的元素出队前其cnt值已经计算完毕 
				}
            }
        }
    }
    cout<<cnt[n-1][m-1]<<endl;
    return 0;
}