蓝桥杯2021年第十二届真题第二场-国际象棋

2023-11-08

题目

题目描述

众所周知,“八皇后” 问题是求解在国际象棋棋盘上摆放 8 8 8 个皇后,使得两两之间互不攻击的方案数。

已经学习了很多算法的小蓝觉得 “八皇后” 问题太简单了,意犹未尽。

作为一个国际象棋迷,他想研究在 N × M N × M N×M 的棋盘上,摆放 K K K 个马,使得两两之间互不攻击有多少种摆放方案。

由于方案数可能很大,只需计算答案除以 1000000007 1000000007 1000000007 (即 1 0 9 + 7 10^9+7 109+7) 的余数。

如下图所示,国际象棋中的马摆放在棋盘的方格内,走 “日” 字,位于 ( x , y ) ( x , y ) (x,y) 格的马(第 x x x 行第 y y y 列)可以攻击 ( x + 1 , y + 2 ) ( x + 1 , y + 2 ) (x+1,y+2) ( x + 1 , y − 2 ) ( x + 1 , y − 2 ) (x+1,y2) ( x − 1 , y + 2 ) ( x − 1 , y + 2 ) (x1,y+2) ( x − 1 , y − 2 ) ( x − 1 , y − 2 ) (x1,y2) ( x + 2 , y + 1 ) ( x + 2 , y + 1 ) (x+2,y+1) ( x + 2 , y − 1 ) ( x + 2 , y − 1 ) (x+2,y1) ( x − 2 , y + 1 ) ( x − 2 , y + 1 ) (x2,y+1) ( x − 2 , y − 1 ) ( x − 2 , y − 1 ) (x2,y1)共 8 个格子。

输入格式
输入一行包含三个正整数 N N N , M M M , K K K,分别表示棋盘的行数、列数和马的个数。

输出格式
输出一个整数,表示摆放的方案数除以 1000000007 1000000007 1000000007 (即 1 0 9 + 7 10^9+7 109+7) 的余数。

输入样例1
1 2 1

输出样例1
2

输入样例2
4 4 3

输出样例2
276

输入样例3
3 20 12

输出样例3
914051446

数据范围
对于 5 % 5\% 5% 的评测用例,$K = $
对于另外 10 % 10\% 10% 的评测用例, K = 2 K = 2 K=2
对于另外 10 % 10\% 10% 的评测用例, N = 1 N = 1 N=1
对于另外 20 % 20\% 20% 的评测用例, N , M ≤ 6 N , M ≤ 6 N,M6 K ≤ 5 K ≤ 5 K5
对于另外 25 % 25\% 25% 的评测用例, N ≤ 3 N ≤ 3 N3 M ≤ 20 M ≤ 20 M20 K ≤ 12 K ≤ 12 K12
对于所有评测用例, 1 ≤ N ≤ 6 1 ≤ N ≤ 6 1N6 1 ≤ M ≤ 100 1 ≤ M ≤ 100 1M100 1 ≤ K ≤ 20 1 ≤ K ≤ 20 1K20

题解

f[i][k][b][a]:在前 i i i 行放置了 k k k 个马,且第 i − 1 i − 1 i1 行的状态为 b b b,第 i i i 行的状态为 a a a 的方案数。

  • 由于我们要用一个二进制数表示每一行的状态,而此题的 m = 100 m = 100 m=100,但 2 100 2^{100} 2100 是无法接受的
  • 因此我们可以换个思路,将棋盘看成是 M × N M × N M×N 的,这样每行最多仅有 2 6 2^6 26 个二进制状态

如何判断冲突:

  • 假设第 i i i 行的状态为 a a a,第 i − 1 i − 1 i1 行的状态为 b b b,第 i − 2 i − 2 i2 行的状态为 c c c
    若想在第 i i i 行的第 j j j 列放一匹马,则:
  • i − 1 i − 1 i1 行的第 j − 2 j − 2 j2 j + 2 j + 2 j+2 列不能有马,即 a & (b << 2) == 0a & (b >> 2) == 0
  • i − 2 i − 2 i2 行的第 j − 1 j − 1 j1 j + 1 j + 1 j+1 列不能有马,即 a & (c << 1) == 0a & (c >> 1) == 0
  • 同时第 i − 1 i − 1 i1 行与第 i − 2 i − 2 i2 行也不能有冲突,即 b & (c << 2) == 0b & (c >> 2) == 0

代码

#include<bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;

int n, m, K, ans, dp[110][21][100][100];

int count (int x) {
	int res = 0;
	while (x) {
		res += (x & 1);
		x >>= 1;
	}
	return res;
}

int main()
{
	cin >> n >> m >> K;
	
	dp[0][0][0][0] = 1;
	
	for (int i = 1;i <= m;i ++) 
		for (int k = 0;k <= K;k ++)
			for (int a = 0;a < 1 << n;a ++) { // 第i行的状态 
				for (int b = 0;b < 1 << n;b ++) { // 第i-1行的状态 
					if ((a & (b << 2)) || (a & (b >> 2))) continue;
					for (int c = 0;c < 1 << n;c ++) { // 第i-2行的状态 
						if ((a & (c << 1)) || (a & (c >> 1))) continue;
						if ((b & (c << 2)) || (b & (c >> 2))) continue;
						int t = count (a);
						if (k >= t)
							dp[i][k][b][a] = (dp[i][k][b][a] + dp[i-1][k - t][c][b]) % MOD;
					}
				}
			}
	
	for (int a = 0;a < 1 << n;a ++) 
		for (int b = 0;b < 1 << n;b ++) 
			ans = (ans + dp[m][K][b][a]) % MOD;
		
	
	cout << ans << endl;
	return 0;
}

转自 业余算法学徒

存在一个问题,不用考虑蹩马腿的情况吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯2021年第十二届真题第二场-国际象棋 的相关文章

  • 面向对象设计的SOLID原则

    S O L I D是面向对象设计和编程 OOD OOP 中几个重要编码原则 Programming Priciple 的首字母缩写 SRP The Single Responsibility Principle 单一责任原则 OCP The

随机推荐

  • matlab练习程序(图像滤波时的边界处理)

    我们在写滤波程序时一般会用矩阵模板与原图像做卷积 这时候在做图像边界的处理是一般都选择忽略边缘 不过要是模板比较大 那么处理的效果就不好了 图像四周就会是原图像 中间才是滤波后的结果 虽然用Matlab的imfilter就能解决 不过还是自
  • 人脸识别对齐,向量搜索

    人脸对齐的概念 1 查找人脸 我们可以使用dlib来查找人脸 也就是所谓的侦测人脸 可以从下面github的地址去拿到models 人脸查找的models dnnFaceDetector dlib cnn face detection mo
  • #cmakedefine真实含义

    cmakedefine 用于configure file 中用于生成头文件的文件中 只有当CMakeLists txt中的同名变量为真时才会在生成的头文件中定义 区别于 define无论何时都会定义
  • 中介者模式-C++实现

    跟我在公司搭的框架好像 MediatorPattern cpp 定义控制台应用程序的入口点 include stdafx h include
  • buck变换器设计matlab_开关电源控制环路设计,非常实用!

    欢迎加入技术交流QQ群 2000人 电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子 新能源干货 行业发展趋势分析 最新产品介绍 众多技术达人与您分享经验 欢迎关注微信公众号 电力电子技术与新能源 M
  • RichErp - vue 使用总结 - data 和 props

    data仅代表自己的内部的状态数据 所以如果一个Component仅仅是自身改变状态 然后把状态反馈给外界的话 理论上说只用data就可以了 显然组件通常不会这样 而是需要一种可进可出的状态 也就是允许外界对组件内部的数据进行修改 同时组件
  • R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色,能够实现散点图矩阵图的可视化

    R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色 能够实现散点图矩阵图的可视化 本文将介绍这两个函数的用法 并通过源代码演示如何使用它们进行数据可视化 1 R语言的pairs函数 pairs函数是R语言中一个强大的数
  • React 进阶: useSyncExternalStore API 外部状态管理

    React 进阶 useSyncExternalStore API 外部状态管理 文章目录 React 进阶 useSyncExternalStore API 外部状态管理 完整代码示例 动机 关于状态的思考 方案一 自行接入外部状态 外部
  • 分类器概念篇

    分类器是数据挖掘中对样本进行分类的方法的统称 包含决策树 逻辑回归 朴素贝叶斯 神经网络等 分类器的构造和实施大体会经过以下几个步骤 选定样本 包含正样本和负样本 将所有样本分成训练样本和测试样本两部分 在训练样本上执行分类器算法 生成分类
  • 以违停检测为示例的利用微软云AIOT技术加速项目落地

    AIoT即融合了AI 人工智能 和IoT 物联网 的技术 图形图像处理是人工智能领域中重要的一个分支 在日常生活中也存在大量基于图形图像的处理的场景 比如交通违章抓拍 基于视觉的司机防疲劳监测 家用摄像机的老人摔倒报警等功能 对于物联网则在
  • Kafka消息分区&producer拦截器&无消息丢失(八)

    上篇文章说了 acks 1代表什么都不管 即使配置了回调也不会起作用 0代表不会等待replic副本里的不会持久化 只要broker leader持久化成功则返回给producer 1代表all 则表示全部持久化成功才返回成功给produc
  • dubbo分布式日志跟踪

    dubbo分布式日志追踪 需要修改两个地方 一个是consumer端的 InvokerInvocationHandler java 红色是修改的地方 public class InvokerInvocationHandler impleme
  • 微服务项目打包时指定jar包复制到同一文件夹下

    转载于原文 在项目最外层pom文件中指定文件存放位置
  • 密码学技术如何选型?再探工程能力边界的安全模型|第5论

    作者 李昊轩 来源 微众银行区块链 牢不可破的密码学算法也怕物理攻击 物理信号泄露为何会威胁到隐私保护的效果 隐私保护方案对部署环境有何讲究 不可信执行环境下如何设计隐私保护方案 这里 我们将继续安全模型的分析 由隐私保护技术方案中理论层面
  • JMeter 测试脚本编写技巧

    是一款开源软件 用于进行负载测试 性能测试及功能测试 测试人员可以使用 JMeter 编写测试脚本 模拟多种不同的负载情况 从而评估系统的性能和稳定性 以下是编写 JMeter 测试脚本的步骤 第 1 步 创建测试计划 在JMeter中 测
  • java 下mp3 转 pcm、wav

    mp3 转 pcm wav 由于MP3直接转为wav 容易出现文件大小为0k 时间缩短等问题 这里是通过先将mp3转成pcm 然后在通过pcm转成wav 下面直接上代码 先引入所需要的jar包
  • CentOS系统安装libssl-dev时No package libssl-dev availab

    libssl dev是ubuntu系统的库 而centos系统对应的是openssl devel centos中运行yum install openssl devel ubuntu系统运行apt get install libssl dev
  • 7.2 IDEA 没有Java EE

    方法二 第一步 正常创建一个新的New Project 创建完成后 选择项目包 gt 点击右键 gt 点击Add Framework Support 然后勾选Web Application 4 之后点击OK确认即可 完美的创建了JavaEE
  • C#断点续传的实现示例

    断点续传是一种可以在文件传输过程中出现断电 网络故障等情况时 能够保证传输内容不会全部丢失 而是可以从已传输的位置继续传输的机制 在文件传输较大 较复杂的情况下 使用断点续传可以提高传输质量 稳定性和效率 在C 中 可以使用HTTP协议的R
  • 蓝桥杯2021年第十二届真题第二场-国际象棋

    题目 题目描述 众所周知 八皇后 问题是求解在国际象棋棋盘上摆放 8 8 8 个皇后 使得两两之间互不攻击的方案数 已经学习了很多算法的小蓝觉得 八皇后 问题太简单了 意犹未尽 作为一个国际象棋迷 他想研究在 N M