膜了一波WXH天犇的代码,woc,惊为天人,代码还能这么写的!?
注意:以下我们说的存储全部是基于右边是低位,左边是高位的写数意识,最右边是第一位。
#include
using namespace std;
const int maxn=105,maxv=177147+105,mod=20110520;
int n,m,to;//要保证m比较小;
char op[maxn];
char s[maxn][maxn];
int dp[maxn][maxv],table[maxn],cur;
inline void upd(int &x,int y)
{
x+=y;
if(x>=mod)x-=mod;
}
void Init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",op+1);
for(int j=1;j<=m;j++)
{
if(n>m)
s[i][j]=op[j];
else
s[j][i]=op[j];
}
}
if(m>n)swap(n,m);
table[0]=1;
for(int i=1;i<=m+1;i++)table[i]=table[i-1]*3;
}
void MakeDp()
{
cur=0;
dp[0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++,cur^=1)
{
memset( dp[ cur^1 ], 0, sizeof (dp[ cur^1 ]) );
for(int k=0;k1];k++)if(dp[cur][k])
{
int left=k%3,up=k/table[j]%3;
int t=dp[cur][k];
if(s[i][j]=='*')
{
if(!left && !up)upd(dp[cur^1][k],t);
continue;
}
if(j==1 && left)
continue;
if(!left)
{
if(!up)
{
upd(dp[cur^1][k+1],t);
upd(dp[cur^1][k+table[j]*2+2],t);
upd(dp[cur^1][k+table[j]],t);
}
else if(up==1)
{
upd(dp[cur^1][k],t);
upd(dp[cur^1][k-table[j]+2],t);
}
else
{
upd(dp[cur^1][k],t);
upd(dp[cur^1][k-table[j]*2],t);
}
}
else if(left==1)
{
if(!up)
{
upd(dp[cur^1][k+table[j]*2-1],t);
upd(dp[cur^1][k],t);
}
else if(up==1)
{
upd(dp[cur^1][k-table[j]-1],t);
}
}
else
{
if(!up)
{
upd(dp[cur^1][k],t);
upd(dp[cur^1][k-2],t);
}
}
}
}
}
printf("%d\n",dp[cur][0]);
}
int main()
{
freopen("in.txt","r",stdin);
Init();
MakeDp();
return 0;
}