2331: [SCOI2011]地板

来源:互联网 发布:直播狗网络电视官网 编辑:程序博客网 时间:2024/03/28 21:11

插头dp;
姿态1;

#include<cstdio>#include<algorithm>#include<bitset>#define rep(i,k,n) for(int i=k;i<=(n);i++)#define mod 20110520using namespace std;const int N = 5000000;int n, m;int g[N], ans[N], state[700000], op = 0, top = 0;char s[105][105];int a[105][105];bool ok(int x) {    rep(i, 0, m) {        if((x >> (i * 2)) % 4 == 3)return false;    }    return true;}void init_state() {    rep(i, 0, (1 << ((m+1) * 2)) - 1)if(ok(i))state[++top] = i;  //}inline int F(int x, int pos, int up, int left) {    int tmp = (x >> (pos * 2)) % 4;    tmp ^= up;    x ^= (tmp << (pos * 2));    x >>= 2;    x <<= 2;    x ^= left;    return x;}int main() { //   freopen("in.in", "r", stdin);    scanf("%d%d", &n, &m);    rep(i, 1, n)scanf("%s", s[i] + 1);    if(n >= m) {        rep(i, 1, n)rep(j, 1, m)a[i][j] = (s[i][j] == '_' ? 1 : 0);    } else {        rep(i, 1, n)rep(j, 1, m)a[j][i] = (s[i][j] == '_' ? 1 : 0);        swap(n, m);    }    init_state();    ans[0]=1;    rep(i, 1, n) {        rep(j, 1, m) {            rep(k, 1, top)g[state[k]] = 0;            if(a[i][j]) {                rep(k, 1, top) {                    int tmp = state[k];                    if(!ans[state[k]])continue;                    int left = tmp % 4;                    int up = (tmp >> (j * 2)) % 4;                    if(!left && !up) {                        int ne = F(tmp, j, 2, 0);                        g[ne] = (g[ne] + ans[tmp]) % mod;                        ne = F(tmp, j, 0, 2);                        g[ne] = (g[ne] + ans[tmp]) % mod;                        ne = F(tmp, j, 1, 1);                        g[ne] = (g[ne] + ans[tmp]) % mod; //轮廓线!!                    }                    if(left == 1 && up == 0) {                        int ne = F(tmp, j, 0, 1);                        g[ne] = (g[ne] + ans[tmp]) % mod;                        ne = F(tmp, j, 0, 0);                        g[ne] = (g[ne] + ans[tmp]) % mod;                    }                    if(left == 0 && up == 1) {                        int ne = F(tmp, j, 1, 0);                        g[ne] = (g[ne] + ans[tmp]) % mod;                        ne = F(tmp, j, 0, 0);                        g[ne] = (g[ne] + ans[tmp]) % mod;                    }                    if(left== 2 && up == 0) {                        int ne = F(tmp, j, 0, 2);                        g[ne] = (g[ne] + ans[tmp]) % mod;                        ne = F(tmp, j, 1, 0);                        g[ne] = (g[ne] + ans[tmp]) % mod;                    }                if(left == 0 && up == 2) {                    int ne = F(tmp, j, 2, 0);                    g[ne] = (g[ne] + ans[tmp]) % mod;                    ne = F(tmp, j, 0, 1);                    g[ne] = (g[ne] + ans[tmp]) % mod;                }                if(left == 2 && up == 2) {                    int ne = F(tmp, j, 0, 0);                    g[ne] = (g[ne] + ans[tmp]) % mod;            }        }        rep(k, 1, top)ans[state[k]] = g[state[k]];    }    else {        rep(k, 1, top) {int tmp = state[k]; if((tmp % 4) || ((tmp >> (j * 2)) % 4))ans[tmp] = 0;        }    }}rep(k, 1, top) { int tmp = state[k];   if(tmp % 4)ans[tmp] = 0;}}printf("%d\n",ans[0]);return 0;}
0 0
原创粉丝点击