计算猫抓老鼠游戏的概率 【题目描述】 有这样一个游戏:在一个 n*n 的格子棋盘里,n 是奇数;有两种棋子,一个是只 能横向移动的棋子猫,一个是可以上下左右移动的棋子老鼠。假设老鼠在棋盘的正 中央,第一步老鼠将进行上下左右的随机移动。棋子猫在从棋盘的中间行的最左边 向棋盘的最右边移动,棋子猫每次移动只能是从左到右移动一步,第一步是猫位于 棋盘的中间行的最左边格子。请问:在猫移动到棋盘外面前,会有多大概率抓到老 鼠? 【输入格式】 输入一个大于 1 的奇数 n,表示棋盘的大小。 【输出格式】 棋子猫抓到棋子老鼠的概率。(小数四舍五入保留 4 位有效数字) 【样例输入】(测试数据不包含本样例) 3 【样例输出】 0.6667
时间: 2024-04-21 21:23:28 浏览: 330
这是一个经典的概率问题,可以使用动态规划来解决。下面是一个使用C++实现的代码示例:
```cpp
#include <iostream>
#include <vector>
using namespace std;
double catchProbability(int n) {
int center = n / 2; // 获取棋盘中心位置
vector<vector<double>> dp(n, vector<double>(n, 0.0));
dp[center][center] = 1.0; // 老鼠初始位置概率为1
// 从中心位置开始向四周扩散
for (int steps = 1; steps <= center; steps++) {
for (int i = center - steps; i <= center + steps; i++) {
for (int j = center - steps; j <= center + steps; j++) {
if (i == center - steps || i == center + steps || j == center - steps || j == center + steps) {
// 边界情况,老鼠只能向内移动
dp[i][j] += dp[i][j - 1] * 0.25;
dp[i][j] += dp[i][j + 1] * 0.25;
dp[i][j] += dp[i - 1][j] * 0.25;
dp[i][j] += dp[i + 1][j] * 0.25;
} else {
// 内部情况,老鼠可以向内移动或向外移动
dp[i][j] += dp[i][j - 1] * 0.25;
dp[i][j] += dp[i][j + 1] * 0.25;
dp[i][j] += dp[i - 1][j] * 0.25;
dp[i][j] += dp[i + 1][j] * 0.25;
dp[i][j] += dp[i][center - steps - 1] * 0.25;
dp[i][j] += dp[i][center + steps + 1] * 0.25;
dp[i][j] += dp[center - steps - 1][j] * 0.25;
dp[i][j] += dp[center + steps + 1][j] * 0.25;
}
}
}
}
// 计算猫抓到老鼠的概率
double catchProb = 0.0;
for (int i = center + 1; i < n; i++) {
catchProb += dp[center][i];
}
return catchProb;
}
int main() {
int n;
cin >> n;
double probability = catchProbability(n);
cout.precision(4);
cout << fixed << probability << endl;
return 0;
}
```
希望这个代码能够帮助到你解决问题!如果还有其他问题,请随时提问。
阅读全文