P5056 样例输出0 /kk
调了好久,没找到bug,球球神仙指导(可能是很浅的bug
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=50000,M=N*2+7;
int n,m,end_x,end_y;
int g[20][20],q[2][N],cnt[N];
int h[2][M];
ll v[2][M];
inline int find(int cur,int x){
int t=x%M;
while(h[cur][t] != -1 && h[cur][t] != x)
if(++t == M)
t=0;
return t;
}
inline void insert(int cur,int state,ll w){
int t=find(cur,state);
if(h[cur][t] == -1){
h[cur][t]=state,v[cur][t]=w;
q[cur][++cnt[cur]]=t;
}
else v[cur][t]+=w;
}
inline int get(int state,int k){
return state>>k*2&3;
}
inline int set(int k,int v){
return v*(1<<k*2);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
char str[20];
scanf("%s",str+1);
for(int j=1;j<=m;++j)
if(str[j] == '.'){
g[i][j]=1;
end_x=i,end_y=j;
}
}
ll res=0;
memset(h,-1,sizeof h);
int cur=0;
insert(cur,0,1);
for(int i=1;i<=n;++i){
for(int j=1;j<=cnt[cur];++j)
h[cur][q[cur][j]]<<=2;
for(int j=1;j<=m;++j){
//cout<<i<<" "<<j<<endl;
int last=cur;
cur^=1,cnt[cur]=0;
memset(h[cur],-1,sizeof h[cur]);
for(int k=1;k<=cnt[last];++k){
int state=h[last][q[last][k]];
ll w=v[last][q[last][k]];
int x=get(state,j-1),y=get(state,j);
if(!g[i][j]){
if(!x && !y) insert(cur,state,w);
}
else if(!x && !y){
if(g[i+1][j] && g[i][j+1])
insert(cur,state+set(j-1,1)+set(j,2),w);
}
else if(!x && y){
if(g[i][j+1]) insert(cur,state,w);
if(g[i+1][j]) insert(cur,state+set(j-1,y)-set(j,y),w);
}
else if(x && !y){
if(g[i][j+1]) insert(cur,state-set(j-1,x)+set(j,x),w);
if(g[i+1][y]) insert(cur,state,w);
}
else if(x==1 && y==1){
for(int u=j+1,s=1;;u++){
int z=get(state,u);
if(z == 1) s++;
else if(z == 2){
if(--s == 0){
insert(cur,state-set(j-1,x)-set(j,y)-set(u,1),w);
break;
}
}
}
}
else if(x==2 && y==2){
for(int u=j-2,s=1;;u--){
int z=get(state,u);
if(z == 2) s++;
else if(z == 1){
if(--s == 0){
insert(cur,state-set(j-1,x)-set(j,y)+set(u,1),w);
break;
}
}
}
}
else if(x==2 && y==1){
insert(cur,state-set(j-1,x)-set(j,y),w);
}
else if(i==end_x && j==end_y){
res+=w;
//cout<<"i am here"<<endl;
}
}
}
}
cout<<res;
return 0;
}