1 条题解
-
0
题解:石头跳跃游戏的最优解
题意分析
题目描述了一个在无限网格上的石头跳跃游戏,规则类似于跳棋:
- 初始有的矩形石头阵列
- 石头可以水平或垂直跳过相邻石头,被跳过的石头会被移除
- 目标是通过一系列操作使剩余石头数量最少
解题思路
通过数学分析可以发现:
- 当或是的倍数时,最少可以剩下2颗石头
- 当或为或时,最少可以剩下颗石头
- 其他情况下,最少可以剩下颗石头
实现步骤
- 输入处理:读取和的值
- 大小排序:确保以简化判断
- 条件判断:
- 检查是否为1或2的特殊情况
- 检查是否为3的倍数
- 默认情况处理
- 结果输出:根据条件输出最少剩余石头数
代码注释
#include <iostream> using namespace std; int main() { int m, n, t; // 定义变量:m行数,n列数,t临时变量 // 循环读取输入(虽然题目可能只给一组输入,但这样写更通用) while (cin >> m >> n) { // 确保m >= n,简化后续判断 if (n > m) { t = n; n = m; m = t; } // 特殊情况处理:当n=1或2时 if (n == 1 || n == 2) // 最少剩余石头数为(m+1)/2的整数部分 cout << (m + 1) / 2 << endl; // 当m或n是3的倍数时 else if (n % 3 == 0 || m % 3 == 0) // 最少可以剩下2颗石头 cout << "2" << endl; // 其他情况 else // 最少可以剩下1颗石头 cout << "1" << endl; } return 0; // 程序正常结束 }
复杂度分析
- 时间复杂度:,只有简单的条件判断
- 空间复杂度:,只使用了固定数量的变量
- 1
信息
- ID
- 1606
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者