2019 蓝桥杯省赛 B 组模拟赛 结果填空:马的管辖
题意
每匹马在不蹩脚的情况下能跳到的地方就是该马能管辖的范围,问在5*5的格子下至少需要多少匹马能管辖到所有格子。
思路
二进制枚举每一种情况,分开讨论。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int g[6][6],vis[6][6];
int dx[8]={-2,-1,2,1,-2,1,2,-1};
int dy[8]={-1,-2,-1,2,1,-2,1,2};
int fx[4]={-1,0,1,0};
int fy[4]={0,-1,0,1};
bool check(int x,int y){
if(x>=0&&x<n&&y>=0&&y<m) return 1;
else return 0;
}
int main(){
n=5,m=5;
int r=n*m;
int res=0;//马的数量
int cnt=0;//覆盖的格子数量
int minn=25;//马最小数量
int ans=0;//方案数
for(int i=0;i<(1<<r);i++){//枚举方案数
res=cnt=0;
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
for(int j=0;j<r;j++){//遍历二进制的每一位
if(i&(1<<j)){//判断该位是否存在
g[j/n][j%m]=1;
vis[j/n][j%m]=1;
res++;cnt++;
}
}
if(res>minn) continue;
for(int j=0;j<n;j++){
for(int k=0;k<m;k++){
if(g[j][k]){
for(int kk=0;kk<4;kk++){
int mx=j+fx[kk];
int my=k+fy[kk];
if(check(mx,my)&&!g[mx][my]){//判断是否蹩脚
for(int h=kk;h<8;h+=4){
int nx=j+dx[h];
int ny=k+dy[h];
if(check(nx,ny)&&!vis[nx][ny]) {//不蹩脚马覆盖的范围
vis[nx][ny]=1;
cnt++;
}
}
}
}
}
}
}
if(cnt!=25) continue;
else {
if(res<minn){
minn=res;
ans=1;
}
else if(res==minn) ans++;
}
}
cout<<minn<<' '<<ans<<'\n';
return 0;
}
七月在野,八月在宇,九月在户,十月蟋蟀入我床下