1 solutions

  • 0
    @ 2023-10-18 9:56:20

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=14,M=1<<12;
    const int P=1e8;
    int n,m;
    typedef long long LL;
    LL f[N][M];
    vector<int> state,h[M]; //state 表示合法的状态集合 h[i]表示第i个状态可以到的合法转移 
    int g[N]; //换的土地的集合 
    bool check(int x) //获得合法状态 
    {
        for(int i=0;i<m;i++)
        {
            if(x>>i&1&&(x>>i+1&1)) return false;
        }
        return true;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<m;j++)
            {
                int x;
                cin>>x;
                if(x==0) //使用二进制的形式得到坏田的集合 
                {
                    g[i]+=(1<<j);
                }
            }
        }
        for(int i=0;i<(1<<m);i++) //枚举所有合法状态 
        {
            if(check(i))
            {
                state.push_back(i);
            }
        }
        for(int i=0;i<state.size();i++) //第i行的状态 
        {
            for(int j=0;j<state.size();j++) //第i-1行的状态 
            {
                int a=state[i],b=state[j];
                if((a&b)==0) //上下挨着的 
                {
                    h[i].push_back(j);
                }
            }
        }
        f[0][0]=1; //初始状态 
        for(int i=1;i<=n+1;i++) //枚举到第n+1行,这样就不用枚举最后一行的情况 
        {
            for(int j=0;j<state.size();j++) //第i行的状态 
            {
                for(int k=0;k<h[j].size();k++) //第i-1行的状态 
                {
                    int a=state[j],b=state[h[j][k]];
                    if(a&g[i]) continue; //第i行的状态和坏土地有重合 
                    f[i][a]=(f[i][a]+f[i-1][b])%P; //累加方案 
                }
            }
        }
        cout<<f[n+1][0]; //等价于第n+1行,一个都不放的方案数 
        return 0;
    }
    
    • 1

    Information

    ID
    761
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By