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;
}
原文地址:https://www.cnblogs.com/kczno1fans/p/7703509.html