当前位置: 首页 > news >正文

UVa 696 How Many Knights

题目描述

在国际象棋中,骑士(马)的攻击方式为:水平移动222格、垂直移动111格,或水平移动111格、垂直移动222格。给定一个M×NM \times NM×N的棋盘(M,N≤500M, N \le 500M,N500),求最多能放置多少个骑士,使得任意两个骑士互不攻击。

输入格式

多组数据,每行两个整数MMMNNN,以0 0结束。

输出格式

对于每组数据,输出一行,格式为:

X knights may be placed on a M row N column board.

其中XXX为最大骑士数。

样例

输入

2 3 5 5 4 7 0 0

输出

4 knights may be placed on a 2 row 3 column board. 13 knights may be placed on a 5 row 5 column board. 14 knights may be placed on a 4 row 7 column board.

题目分析

本题是经典的“棋盘上放置骑士”问题。骑士的攻击关系构成一个二分图(骑士只攻击异色格),因此最大独立集 = 总格数 - 最大匹配数。但由于棋盘可达500×500500 \times 500500×500,二分图匹配不可行。但本题有更简单的数学规律:

  • M>NM > NM>N,交换MMMNNN,使M≤NM \le NMN
  • M=1M = 1M=1:可以放满所有格子,即NNN
  • M=2M = 2M=2:每444列可放444个(两行各222个),剩余列按规律放置。
  • M≥3M \ge 3M3:可以放置⌈M×N2⌉\lceil \frac{M \times N}{2} \rceil2M×N个(即所有格子的一半,上取整),因为可以按棋盘染色,所有同色格互不攻击(骑士攻击异色格)。

但注意当M=3M = 3M=3NNN较小时,规律略有不同,但上述公式仍适用。

解题思路

  1. M>NM > NM>N,交换MMMNNN
  2. M=1M = 1M=1,答案=N= N=N
  3. M=2M = 2M=2,答案=4×⌊N/4⌋+2×min⁡(N mod 4,2)= 4 \times \lfloor N/4 \rfloor + 2 \times \min(N \bmod 4, 2)=4×N/4+2×min(Nmod4,2)
  4. 否则,答案=⌈M×N2⌉= \lceil \frac{M \times N}{2} \rceil=2M×N

复杂度分析

  • O(1)O(1)O(1)时间。

代码实现

// How Many Knights// UVa ID: 696// Verdict: Accepted// Submission Date: 2016-08-25// UVa Run Time: 0.010s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intm,n;while(cin>>m>>n){if(m==0&&n==0)break;intmaxCounter=0;if(m==0||n==0)maxCounter=0;elseif(m==1||n==1)maxCounter=max(m,n);elseif(m==2||n==2){intnext_m=max(m,n);maxCounter=next_m/4*4;next_m=next_m%4;if(next_m>2)next_m=2;maxCounter+=next_m*2;}elseif(m==3||n==3){intnext_m=max(m,n);maxCounter=next_m/2*3;if(next_m%2==1)maxCounter+=2;}else{introw_counter=0,column_counter=0;if(m%2==1){row_counter=n/2*m;if(n%2==1)row_counter+=(m+1)/2;}elserow_counter=n*((m+1)/2);if(n%2==1){column_counter=m/2*n;if(m%2==1)column_counter+=(n+1)/2;}elsecolumn_counter=m*((n+1)/2);maxCounter=max(row_counter,column_counter);}cout<<maxCounter<<" knights may be placed on a "<<m<<" row "<<n<<" column board.\n";}return0;}

总结

本题通过分类讨论得出骑士最大放置数的公式。关键点包括:

  • 对于M=1M=1M=1M=2M=2M=2的特殊处理。
  • 对于M≥3M \ge 3M3,利用棋盘染色性质,最多放置一半格子(上取整)。
  • 注意MMMNNN可以互换。

该解法是棋盘放置问题的经典结论,适合作为数学规律题练习。

http://www.jsqmd.com/news/1210995/

相关文章:

  • Windows内存压缩性能优化指南
  • 汽车电子驻车系统(EPB)核心技术解析
  • 二维运动目标如何实现稳定跟踪?卡尔曼滤波位置与速度估计实战
  • STM32生理监测装置设计与低功耗优化实践
  • AI 漫剧角色标记提效:50集4000~5000句台词自动标记流程
  • AI 每日学习 — Spring Boot 中基于 SSE 的大模型流式响应:从协议到生产落地
  • 微信小程序视频平台开发全攻略
  • C++ I/O流深度解析:从基础操作到性能优化与避坑指南
  • 生产级机器学习服务部署:FastAPI+Docker+K8s工程实践
  • 第三章 工质状态与热力学过程(二)---可压缩性与理想气体模型
  • 江诗丹顿官方售后服务中心地址与服务电话实地考察报告+多信源验证(2026年7月最新) - 江诗丹顿官方服务中心
  • 交易型时序预测框架:面向业务语义的特征工程与模型适配
  • 飞牛云fnOS NAS系统安装与功能全解析
  • 基于Isaac GR00T平台构建AI机器人:从仿真训练到边缘部署的实战指南
  • Godot项目逆向恢复实战:从PCK文件到可编辑源码的完整指南
  • C++多线程资源访问冲突:从原理到实战的完整解决方案
  • Spring Cloud 2025版本演进与微服务架构实践指南
  • C语言函数与指针:从基础到高级应用
  • 医疗临床数据可视化产品技术刚性,为何“生死攸关”?
  • TM4C123GH6ZRB ADC采样序列与数字比较器实战配置详解
  • 高内涵成像系列(一):揭开HCS的面纱——如何把细胞图像变成可量化的生命数据?
  • 2026年7月最新苏州卡地亚官方售后客户服务热线与维修网点地址汇总 - 卡地亚服务中心
  • Windows 11官方安装全指南:从准备到优化
  • 向量数据库选型实战:Chroma、Milvus、Faiss、Weaviate核心差异与生产避坑
  • 2026年7月再生手袋面料/苏州防晒衣面料生产商推荐_弘旗(苏州)纺织有限公司 - 行业平台推荐
  • TypeScript特殊类型any、unknown与never的实战指南
  • 时间序列探索性分析:从数据清洗到多尺度可视化
  • R 绘图实战:函数曲线图绘制详解与丰富代码实例
  • 考研英语作文预测题|考研英语作文题目预测|王江涛考研英语写作
  • 从C++到Python重构实战:提升开发效率与代码可维护性