zoukankan      html  css  js  c++  java
  • SCOI 2005 互不侵犯

    SCOI 2005 互不侵犯

    题目描述:

    在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。

    输入格式:

    只有一行,包含两个数N,K。

    输出格式:

    方案数。

    样例输入:

    3 2
    

    样例输出:

    16
    

    提示:

    【数据规模】

    时间限制:1000ms
    空间限制:256MByte

     

    一道状压的水体。。。

    #include<iostream>
    using namespace std;
    
    int f[11][1025][101] , n, m , maxn , ans;
    
    inline int find(int now , int down , int num)
    {
        if(((down << 1) & down) || ((down >> 1) & down)) return -1;
        int asdf = 0;
        for(int i=0;i<n;i++)
        {
            int ce = 1 << i;
            if(down & ce)
            {
                asdf++;
                if((now & ce) || ((now << 1) & ce) || ((now >> 1) & ce)) return -1;
            }
        }
        if(asdf + num > n) return -1;
        return asdf + num;
    }
    
    int main(){
        cin >> n >> m;
        maxn = 1 << n;
        f[0][0][0] = 1;
        for(int i=0;i<n;i++)
            for(int k=0;k<n;k++)
                for(int j=0;j<maxn;j++)
                {
                    if(f[i][j][k])
                    {
                        for(int w=0;w<maxn;w++)
                        {
                            int ce = find(j , w , k);
                            if(ce != -1)
                                f[i + 1][w][ce] += f[i][j][k];
                        }
                    }
                }
        for(int i=0;i<maxn;i++)
            ans += f[n][i][m];
        cout << ans;
    }
  • 相关阅读:
    绑定源特性的行为
    理解IOC和DI
    相遇~~~~
    选美素数~~~~~~~(⊙o⊙)
    狐狸找兔纸
    多重背包Q
    最长升序子序列
    构造逆序数
    田径赛马
    01背包M
  • 原文地址:https://www.cnblogs.com/kczno1fans/p/7703509.html
Copyright © 2011-2022 走看看