题目描述 Description
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。输入描述 Input Description
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)输出描述 Output Description
方案数。样例输入 Sample Input
3 2样例输出 Sample Output
16数据范围及提示 Data Size & Hint
1 <=N <=9, 0 <= K <= N * N题解
本题看起来和八皇后很类似,但实际上用搜索会T掉,正确的解法是状压dp。
阶段:用行来划分阶段,每一行n个位置放国王记为1,不放记为0,一行用一个longlong进行状态压缩,每行状态数不会超过 2n−1 。如此划分阶段,转移时即可只考虑上一行和这一行。
然后可以预处理出所有合法的状态:
先对每一行,从小到大枚举状态i,若i and (i shr 1)为0则说明状态i没有出现国王在一行中相邻的情况,i合法,记录之,并记下i对应的国王数cnt[i];
再对相邻的两行,从小到大枚举状态i,j,若i和j均合法则判断[i and j],[i and (j shr 1)], [j and (i shr 1)],若三者均为0说明状态i和j没有出现国王在列上相邻或在对角线上相邻的情况,合法,记录之。
状态:记f[p][k][i]为前p行共放了k个国王且第p行的状态为i的方案数。
转移:枚举行数p(从2开始),上一行的状态i和这一行的状态j,若i合法、j合法且i和j的组合合法,枚举决策k,k表示前i行放的国王数, f[p][k+cn<
SCOI05互不侵犯King题解
最新推荐文章于 2022-08-20 17:06:01 发布