题目传送
在中国象棋中,马是走日字的。一个马的管辖范围指的是当前位置以及一步之内能走到的位置,下图的绿色旗子表示马能走到的位置。

如果一匹马的某个方向被蹩马脚,它就不能往这个方向跳了,如下图所示,海星的位置存在旗子,马就不能往上跳到那两个位置了:

那么问题来了,在一个 n×m 的棋盘内,如何用最少的马管辖住所有 n×m 个格子。比如 n=m=3 时,最少要用 5 只马才能管辖所有棋盘,一种可能的方案如下:

当 n=m=5 时,请你求出用最少马管辖的 方案个数。

分析:
其实一开始我以为对于3*3的棋盘,两匹马不就够了吗,两匹马的情况下就能覆盖全部的位置;但是题目给的是5匹马;那么题意应是在马跳一次的前提下(以马当前所在的位置,朝8个方向跳一次),能够覆盖全盘的最少马管辖的 方案个数

那么暴力一下就更好了,一般来说10s只能是可以出答案的,还有一个地方就是这个马好像走的是“目”……

说一下怎么暴力吧,说是用到了二进制,怎么个用法呢
我们来看一下下面的数值:
(1)10=(0001)2(1)_{10}=(0001)_2(1)10​=(0001)2​
(2)10=(0010)2(2)_{10}=(0010)_2(2)10​=(0010)2​
(3)10=(0011)2(3)_{10}=(0011)_2(3)10​=(0011)2​
(4)10=(0100)2(4)_{10}=(0100)_2(4)10​=(0100)2​
………………
(15)10=(1111)2(15)_{10}=(1111)_2(15)10​=(1111)2​
在10进制转二进制你会发现我们只需要用到15,就能将4个位置的放置情况枚举出来(1代表有,0代表没有),那么题目中是5*5的方格,那么我们该怎么去枚举情况呢;
其实很简单,我们把这个5*5个方格,也就是25个方格想象成25个位置不就好了,这样我们只需要暴力枚举225的放置情况就好了

具体情况看代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int N = 1e5 + 10;
const int mod = 1e9+7;
int a[30];
int g[10][10];
int minv=inf;
int dx[]={-2,-2,-1,1,2,2,1,-1};//马跳的情况
int dy[]={-1,1,2,2,1,-1,-2,-2};
int pdx[]={-1,-1,0,0,1,1,0,0};//马蹩腿的方向
int pdy[]={0,0,1,1,0,0,-1,-1};int Arrange(int X){int cnt=0;for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){if(X%2)//利用二进制的特点安排马的放置情况g[i][j]=1;elseg[i][j]=0;cnt+=g[i][j];X/=2;}}if(cnt>minv)//算是一个剪枝吧return 0;for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){if(g[i][j]==1){//当前位置有放置的马for(int k=0;k<8;k++){int x=i+dx[k],y=j+dy[k];int tx=i+pdx[k],ty=j+pdy[k];if(x>5 || x<1 || y>5 || y<1) continue;if(tx>5 || tx<1 || ty>5 || ty<1) continue;if(g[tx][ty]==1) continue;//已放置马了就不需要标记了if(g[x][y]==0) g[x][y]=2;//标记一下,说明有一匹马可以通过走日到达,标记符号可以用1之外的数字,这里我用的是2}}}}for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){if(g[i][j]==0){return 0;}}}minv=cnt;return cnt;
}
int main()
{int ub=(1<<25);for(int i=1;i<ub;i++){int t=Arrange(i);//枚举所有的情况if(t)a[t]++;}for(int i=1;i<=25;i++)if(a[i])cout<<a[i]<<endl;return 0;
}

马的管辖 计蒜客 - A2223相关推荐

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

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

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

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

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

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

  4. K - Triangle 计蒜客 - 42405

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

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

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

  6. C - Digital Path 计蒜客 - 42397 05-29

    C - Digital Path 计蒜客 - 42397 题意: 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走,而且下一个位置必须比当前位置的数字大1,入口和出口必须数边缘元素, ...

  7. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...

    在人才招聘领域存在这样一个怪圈,高校每年都说是最难就业年.人才过剩,而对于企业HR来说永远都招不到称心如意的人才.这个怪圈在"计蒜客"创始人俞昊然看来,主要是因为当今高校的教学资源 ...

  8. 计蒜客 - T1012 A*B问题

    计蒜客 - T1012 A*B问题 相信你已经学会 A+B 问题了,那么问题又来了- 输入两个正整数 A 和 B ,求 A×B. 输入格式 一行,包含两个正整数 A 和 B,中间用单个空格隔开. 1≤ ...

  9. 计蒜客网站 ACM-ICPC亚洲区赛题

    The Preliminary Contest for ICPC China Nanchang National Invitational(2019) ACM-ICPC Jiaozuo Onsite ...

最新文章

  1. 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器
  2. java求数列的最大子段和_天下无双的公考必考题 数量关系: 最值问题②(构造数列)...
  3. python取反函数_Python优雅的反函数int(string,base)
  4. javascript中面向对象的5种写法
  5. Google 亚马逊又双叒叕打架了!用户:我只想安静地用产品
  6. Linux 使用 iptables屏蔽IP段
  7. JS API Sample_Query Attachments 查询附件
  8. 浅谈数据挖掘与机器学习
  9. 服务器基础知识大科普
  10. AWK手册(ZYF译)
  11. [计算机毕业设计]深度学习的图标型验证码识别系统
  12. [JavaScript]使用opencv.js实现基于傅里叶变换的频域水印(隐水印)
  13. android视频处理之动态时间水印效果
  14. excel图表美化:用散点标记制作不一样的折线图
  15. 水仙花数的判断(JAVA)
  16. 百度知道与搜搜问问推广的优劣势
  17. Nginx 之父已被释放!
  18. zx-quill+vue+element实现富文本图片上传到服务器
  19. GStreamer使用详解
  20. cGAN网络的基本实现(Mnist数字集)

热门文章

  1. python弹窗_python弹窗运用
  2. 大数据简介视频下载_大数据简介
  3. MacOS Excel 科研作图示例
  4. 笔记-备份还原QCN问题答疑,9008救砖刷机包手动制作
  5. 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)
  6. 《百钱买百鸡》c语言(循环结构)
  7. C/C++ 五子棋游戏
  8. 一体化Mbus物联网主机上线问题总结
  9. 搜狗关键词PC排名 接口
  10. 什么都能播放的媒体播放器——Potplayer