#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15;
const int offset = 3, mask = (1 << offset) - 1;
const int MAXSIZE = 2e4 + 5, Prime = 9973;
typedef long long ll;
int n, m;
char ch;
int b[MAXN], bb[MAXN];
ll d;
struct HashTable {
int head[Prime], next[MAXSIZE], siz;
int state[MAXSIZE];
ll key[MAXSIZE];
void clear() {
siz = 0;
memset(head, -1, sizeof(head));
}
void push(int s) {
int x = s % Prime;
for(int i = head[x]; ~i; i = next[i]) {
if(state[i] == s) {
key[i] += d;
return;
}
}
state[siz] = s; key[siz] = d;
next[siz] = head[x];
head[x] = siz++;
}
void roll() {
for(int i = 0; i < siz; ++i)
state[i] <<= offset;
}
} f[2], *f0, *f1;
int encode() {
int s = 0;
memset(bb, -1, sizeof(bb));
int bn = 1;
bb[0] = 0;
for(int i = m; i >= 0; --i) {
if(!~bb[b[i]]) bb[b[i]] = bn++;
s <<= offset;
s |= bb[b[i]];
}
return s;
}
void decode(int s) {
for(int i = 0; i < m + 1; ++i) {
b[i] = s & mask;
s >>= offset;
}
}
void push(int j, int dn, int rt) {
b[j] = dn;
b[j + 1] = rt;
f1->push(encode());
}
int main() {
ios :: sync_with_stdio(false);
cin >> n >> m;
f0 = f, f1 = f + 1;
f1->clear();
d = 1;
f1->push(0);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cin >> ch;
swap(f0, f1);
f1->clear();
for(int k = 0; k < (f0->siz); ++k) {
decode(f0->state[k]);
d = f0->key[k];
int lt = b[j], up = b[j + 1];
bool dn = i != n - 1, rt = j != m - 1;
if(ch == '*') {
if(!dn && !rt)
push(j, 0, 0);
}
else {
if(lt && up) {
if(lt == up) {
if(i == n - 1 && j == m - 1)
push(j, 0, 0);
}
else {
for(int i = 0; i < m + 1; ++i)
if(b[i] == lt)
b[i] = up;
push(j, 0, 0);
}
}
else if(lt || up) {
int t = lt | up;
if(dn) push(j, t, 0);
if(rt) push(j, 0, t);
}
else {
if(dn && rt) push(j, m, m);
}
}
}
}
f1->roll();
}
assert(f1->siz <= 1);
cout << (f1->siz == 1 ? f1->key[0] : 0) << '\n';
return 0;
}
请问,如果遇到障碍(*), 该如何处理