题目描述

原题链接

分析

结果填空题, 不用考虑时间复杂度,直接暴力枚举每一种方案
5×55×55×5的棋盘, 每一个格子有放或不放马两种状态, 所以一共需要枚举2252^{25}225种方案
每一种方案的具体放法, 压缩在一个数中(通过遍历数的二进制的前252525位得到具体的放法)
检查每种方案是否合法(遍历所有的马, 判断马是否管辖了所有的格子,注意别马腿的情况),
从而得到方案数

此题状态压缩的做法, 和AcWing 95. 费解的开关类似

答案

最少用999匹马, 共909090种方案

实现

// 方案数: 最少用9匹马, 共90种方案
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int map[5][5]; // 1表示该格子有马, 或者被管辖
int dx[] = {0,1,0,-1}, dy[] = {1,0,-1,0}; // 用于检查马的四周是否有马,被别马腿
int spx[4][2] = {{-1,1},{2,2},{1,-1},{-2,-2}}, spy[4][2] = {{2,2},{1,-1},{-2,-2},{-1,1}}; // 马所能跳到的位置
bool vis[5][5];
int ans; // 方案总数
int min_cnt = 0x3f3f3f3f; // 合法方案中, 马最少的数量
int cnt; // 当前方案中, 马的数量
bool check() // 检查当前方案是否合法 (若棋盘所有格子有马,或者被管辖,则合法)
{for(int i=0; i<5; i++)for(int j=0; j<5; j++)if(!vis[i][j]) return false;return true;
}
bool in(int x, int y) // 判断坐标是否合法
{if(x < 0 || x >= 5 || y < 0 || y >= 5) return false;return true;
}
int main()
{for(int i=0; i<1<<25; i++) // 5x5的方格, 每个格子有两种状态, 所以一共2^25种状态, 并把状态压缩到i中;{cnt = 0;memset(map, 0, sizeof(map));memset(vis, 0, sizeof(vis));for(int j=0; j<25; j++) // 将状态压缩到i中, 取i的25位二进制数, 来表示5×5的棋盘的某一方格,是否有马{if(i>>j&1){map[j/5][j%5] = 1;vis[j/5][j%5] = 1;cnt++;}}if(cnt > min_cnt) continue; // 当前方案放的马多, 那就没必要检查是否合法for(int j=0; j<5; j++){for(int k=0; k<5; k++){if(!map[j][k]) continue; // 如果当前格子有马, 就标记该马所能管辖的格子(注意别马腿的情况) for(int l=0; l<4; l++){int nx = j + dx[l], ny = k + dy[l];if(!in(nx, ny) || map[nx][ny]) continue; // 如果没被别马腿, 就标记该马所能管辖的格子{for(int p=0; p<2; p++){int nx = j + spx[l][p], ny = k + spy[l][p];if(in(nx, ny)) vis[nx][ny] = 1; // 标记}}}}}if(check()) // 当前方案合法{if(cnt < min_cnt) // 如果当前方案所用马少, 那就重新计数{min_cnt = cnt; ans = 0;}ans++;}}cout << ans << endl;return 0;
}

计蒜客 A2236 马的管辖 暴力枚举 状态压缩相关推荐

  1. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  2. 计蒜客一月入门赛:《三个火枪手》题解

    题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...

  3. 素数回文(来自计蒜客T1986题目)

    题目: 蒜头君对既是素数又是回文的数特别感兴趣.比如说 151 既是素数又是个回文数.回文数是指从左到右读和从右到左读都一样的数. 现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a ...

  4. 计蒜客2020蓝桥杯大学A组模拟赛题解

    计蒜客2020蓝桥杯大学A组模拟赛题解 蓝桥杯的话,去年拿了C++组的国二.今年报名了新成立的Python组,不知道能不能摸到国一的鱼 模拟赛链接如下: https://www.jisuanke.co ...

  5. 计蒜客 挑战难题 爬楼梯

    计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...

  6. 无脑博士的试管们java_计蒜客 无脑博士和他的试管们

    标签: 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直 ...

  7. 最短路(遍历边)计蒜客—DD坐地铁

    题目: C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi​表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好.DD现在想出门找萨摩耶 ...

  8. K - Triangle 计蒜客 - 42405

    K - Triangle 计蒜客 - 42405 题意: 给你一个三角形的三点,再给你三角形边上一个点,让你求另一个点(也要在三角形上),使得平分三角形的面积 题解: 计算几何 三角形的三边ab,ac ...

  9. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

最新文章

  1. VHDL简单微处理器的设计
  2. (转)es 聚合查询并返回每个组的数据
  3. java runtime类 heap_Java 进阶(一) JVM运行时内存模型
  4. 西瓜哥:公有云也“All-Flash”?
  5. SecureCRT连接Linux显示Mysql记录中文乱码
  6. springboot分页展示功能_基于SpringBoot从零构建博客网站 - 分页显示文章列表功能...
  7. Mac安装Anaconda
  8. android核心基础(5)_Android)java虚拟机和Dalvik虚拟机的区别
  9. 创建表时参数PCTFREE和PCTUSED是什么意思?
  10. Hotel 旅馆 题解(From luoguBlog)
  11. Redis: 为行情数据库设计键值
  12. Python学习笔记——python基础 2. 高级变量类型(列表、元祖、字典)
  13. 地下市场金融牌照疯狂买卖:全牌照可以卖十几个亿
  14. w7怎么把计算机放桌面壁纸,W7电脑系统怎么更改锁屏壁纸
  15. itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题
  16. Jmeter接口测试中参数化的多种方法,你知道的有几种?欢迎评论留言。
  17. R语言错误 --> Error in plot.new() : figure margins too large
  18. XLua热更新框架学习(二)
  19. 面向6G网络自动化的知识驱动可解释人工智能(XAI);基于汽车事件数据的脉冲神经网络目标检测;对称分类方案下波导阵列中的BIC;PreMovNet:基于运动前脑电的抓取和提举手运动学估计
  20. Windows2012 R2安装WMRC提示缺少KB2919355补丁

热门文章

  1. PHPUint 学习笔记
  2. php 唱吧导出,深入曝光唱吧G2真的好吗?怎么样呢?良心点评实际情况
  3. 上周技术关注:XP应该是老板的最爱
  4. C++笔记7:C++提高编程1:模板—[函数模板和类模板]
  5. P106 扑克牌游戏
  6. 智能取餐柜如何解决高校用餐问题
  7. Word2Vec 算法详解
  8. CAD快捷键——标注类
  9. 外设驱动库开发笔记50:HP203B气压传感器驱动
  10. uni-app 动态拼接图片地址,图片无法渲染,静态地址可以显示