萌新没学OI,插头dpWA了(liao)一个点求助
查看原帖
萌新没学OI,插头dpWA了(liao)一个点求助
111728
幻影星坚强楼主2020/8/11 20:07
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, t;
int tu[13][13], zt[13][13][1 << 13];
int main()
{
    scanf("%d", &t);
    while(t --)
    {
        memset(zt, 0, sizeof(zt));
        memset(tu, 0, sizeof(tu));
        scanf("%d%d", &n, &m);
        int maxn = 0, maxm = m;
        for (int i = 1; i <= n; ++ i)
        {
            for (int j = 1; j <= m; ++ j)
            {
                int c;
                scanf("%d", &c);
                tu[i][j] = c;
                if(c == 1)
                {
                	maxn = i;
                	maxm = j;
                }
            }
        }
        zt[0][m][0] = 1;
        for (int i = 1; i <= n; ++ i)
        {
            for (int j = 1; j <= m; ++ j)
            {
                if(j == 1)
                {
                    for (int k = 0; k < (1 << m + 1); ++ k)
                    {
                        if(tu[i][j] == 0)
                        {
                            if((k & 1) == 0)
                            {
                                zt[i][j][(k << 1)] += zt[i - 1][m][k];
                            }
                        }
                        else
                        if((k & 1) == 0)
                        {
                            zt[i][j][(k << 1) | 3] += zt[i - 1][m][k];
                        }
                        else
                        {
                            zt[i][j][(k << 1)] += zt[i - 1][m][k];
                            zt[i][j][(k << 1) ^ 3] += zt[i - 1][m][k];
                        }
                    }
                }
                else
                if(j == m)
                {
                    for (int k = 0; k < (1 << m + 1); ++ k)
                    {
                        if(tu[i][j] == 0)
                        {
                            if(!(((k >> (m - 1)) & 1) | ((k >> m) & 1)))
                            {
                                zt[i][j][k] += zt[i][j - 1][k];
                            }
                        }
                        else
                        {
                            if(((k >> (m - 1)) & 1) == 0 && ((k >> m) & 1) == 1)
                            {
                                zt[i][j][k ^ (1 << (m - 1)) ^ (1 << m)] += zt[i][j - 1][k];
                            }
                            if(((k >> (m - 1)) & 1) == 1 && ((k >> m) & 1) == 0)
                            {
                                zt[i][j][k] += zt[i][j - 1][k];
                            }
                            if(((k >> (m - 1)) & 1) == 1 && ((k >> m) & 1) == 1)
                            {
                                zt[i][j][k ^ (1 << (m - 1)) ^ (1 << m)] += zt[i][j - 1][k];
                            }
                        }
                    }
                }
                else
                for (int k = 0; k < (1 << m + 1); ++ k)
                {
                    if(tu[i][j] == 0)
                    {
                        if(!(((k >> (j - 1)) & 1) | ((k >> j) & 1)))
                        {
                            zt[i][j][k] += zt[i][j - 1][k];
                        }
                    }
                    else
                    {
                        if(((k >> (j - 1)) & 1) == 0 && ((k >> j) & 1) == 0)
                        {
                            zt[i][j][k ^ (1 << (j - 1)) ^ (1 << j)] += zt[i][j - 1][k];
                        }
                        if(((k >> (j - 1)) & 1) == 0 && ((k >> j) & 1) == 1)
                        {
                            zt[i][j][k ^ (1 << (j - 1)) ^ (1 << j)] += zt[i][j - 1][k];
                            zt[i][j][k] += zt[i][j - 1][k];
                        }
                        if(((k >> (j - 1)) & 1) == 1 && ((k >> j) & 1) == 0)
                        {
                            zt[i][j][k] += zt[i][j - 1][k];
                            zt[i][j][k ^ (1 << (j - 1)) ^ (1 << j)] += zt[i][j - 1][k];
                        }
                        if(((k >> (j - 1)) & 1) == 1 && ((k >> j) & 1) == 1)
                        {
                            zt[i][j][k ^ (1 << (j - 1)) ^ (1 << j)] += zt[i][j - 1][k];
                        }
                    }
                }
            }
        }
        printf("%d\n", zt[maxn][maxm][0]);
    }
}
2020/8/11 20:07
加载中...