尽量选不常用的质数
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1000005;
const int mmod=1e9+333+7;
int n,m,dp[1000009],f[1000009],ddp[1000009],ff[1000009];
char a[1000009];
signed main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[(i-1)*m+j];
dp[n*m]=1,ddp[n*m]=1;
for(int i=n;i>=1;i--)
for(int j=m;j>=1;j--)
{
if( i==n&&j==m ) continue;
int now=(i-1)*m+j;
int l=i*m+j,r=(i-1)*m+j+1;
if( a[now]=='#' ) continue;
if( j!=m ) dp[now]+=dp[r],ddp[now]+=ddp[r];
if( i!=n ) dp[now]+=dp[l],ddp[now]+=ddp[l];
dp[now]%=mod,ddp[now]%=mmod;
}
f[1]=1; ff[1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if( i==1&&j==1 ) continue;
int now=(i-1)*m+j;
int l=(i-2)*m+j,r=(i-1)*m+j-1;
if( a[now]=='#' ) continue;
if( j!=1 ) f[now]+=f[r],ff[now]+=ff[r];
if( i!=1 ) f[now]+=f[l],ff[now]+=ff[l];
f[now]%=mod,ff[now]%=mmod;
}
if( f[n*m]==0&&ff[n*m]==0 )//一开始就到不了啊
{
cout << 0;
return 0;
}
int flag=0;
for(int i=2;i<=n*m-1;i++)
if( (dp[i]*f[i]%mod==dp[1] )&&(ddp[i]*ff[i]%mmod==ddp[1]) ) flag=1;//是必经之路
if( flag ) cout << 1;
else cout << 2;
}