萌新求助
查看原帖
萌新求助
763782
zbojin楼主2023/10/14 15:07
#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;
}

请问,如果遇到障碍(*), 该如何处理

2023/10/14 15:07
加载中...