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<<'
';
	
	
	return 0;
} 
七月在野,八月在宇,九月在户,十月蟋蟀入我床下
原文地址:https://www.cnblogs.com/voids5/p/13801072.html