总体上参考ccy,不说了,上代码
#include<stdio.h> #include<string.h> #include<iostream> #define LL long long #define LMTh 1997000 using namespace std; int a[15][15],jz[15],total[2]; LL sum[2][200000]; LL state[2][200000]; int Hash[LMTh]; int n,m,nn,mm,k; inline int cango(int i,int j) { if(i>n||j>m||i<=0||j<=0)return 0; if(0==a[i][j])return 0; return 1; } void mov(void) { int i; jz[0]=0; for(i=1;i<=14;i++) jz[i]=i<<1; } void hash_in(LL s,LL data) { int hashpos=s%LMTh; while(Hash[hashpos]) { if(state[k][Hash[hashpos]]==s) { sum[k][Hash[hashpos]]+=data; return; } hashpos=(hashpos+1)%LMTh;//刚多加了个“+” } total[k]++; Hash[hashpos]=total[k]; state[k][total[k]]=s;sum[k][total[k]]=data; } LL work(void) { LL ans=0;k=0; int i,j,u,v; memset(Hash,0,sizeof(Hash)); memset(sum[k],0,sizeof(sum[k])); memset(state[k],0,sizeof(state[k])); total[k]=0; hash_in(0,1); for( i=1;i<=n;i++) { for( j=1;j<=m;j++) { k^=1; memset(Hash,0,sizeof(Hash)); memset(sum[k],0,sizeof(sum[k])); memset(state[k],0,sizeof(state[k])); total[k]=0; for( u=1;u<=total[1-k];u++) { LL s=state[1-k][u]; LL data=sum[1-k][u]; int p=(s>>jz[j-1])%4; int q=(s>>(jz[j]))%4; if(0==a[i][j]) { if(p==0&&q==0) hash_in(s,data); } else { if(p==0&&q==0) { if(cango(i,j+1)&&cango(i+1,j)) { LL temp=s+(1<<jz[j-1])+(2<<jz[j]); hash_in(temp,data); } continue; } if(p==0&&q>0) { if(cango(i,j+1)) hash_in(s,data); if(cango(i+1,j))//这里居然会漏 { LL temp=s-(q<<jz[j]); temp+=(q<<jz[j-1]); hash_in(temp,data); } continue; } if(p>0&&q==0) { if(cango(i+1,j)) hash_in(s,data); if(cango(i,j+1)) { LL temp=s-(p<<jz[j-1]); temp+=p<<jz[j]; hash_in(temp,data); } continue; } if(p==1&&q==1) { int bra=1; LL temp; for( v=j+1;v<=m;v++) { int w=(s>>jz[v])%4; if(w==1)bra++; else if(w==2)bra--; if(bra==0) { temp=s-(1<<jz[v]); break; } } temp-=(1<<jz[j-1])+(1<<jz[j]); hash_in(temp,data); continue; } if(p==2&&q==2) { int bra=1; LL temp; for(int v=j-2;v>0;v--) { int w=(s>>jz[v])%4; if(w==2)bra++; if(w==1)bra--; if(bra==0) { temp=s+(1<<jz[v]); break; } } temp-=(2<<jz[j])+(2<<jz[j-1]); hash_in(temp,data); continue; } if(p==2&&q==1) { LL temp=s-(p<<jz[j-1])-(q<<jz[j]); hash_in(temp,data); continue; } if(p==1&&q==2&&i==nn&&j==mm) ans+=data; } } } for(int i=1;i<=total[k];i++) state[k][i]=state[k][i]<<2; } return ans; } int main() { mov(); int i,j; char str[16]; scanf("%d%d",&n,&m);getchar(); memset(a,0,sizeof(a)); for( i=1;i<=n;i++) { scanf("%s",&str[1]); for(j=1;str[j];j++) if(str[j]=='.') { a[i][j]=1; nn=i; mm=j; } else if(str[j]=='*')a[i][j]=0; } cout<<work()<<endl;//听说要改成这样 return 0; }