题目要求判断在一张长为a,宽为b的纸上放圆形片的游戏中,先手放纸片的人是否一定能赢。已放好的纸片不能挪动位置,且新放的纸片不能相交但可以外切已放纸片的边界,如果新放不了纸片则算输。
思路:
根据游戏规则,我们可以观察到以下几个情况:
如果r >= min(a, b)/2,即圆形片的半径大于等于纸的最小边长的一半,那么无论先手怎么放纸片,后手都可以把剩下的空间填满,因此先手必输。
如果r * sqrt(2) > min(a, b),即圆形片的直径大于纸的最小边长,那么新放的纸片一定无法外切已放纸片的边界,因此无法进行有效放置,先手必输。
对于其他情况,先手可以先放一个圆心位于纸的中心,半径为r的圆形片。这个圆形片的直径小于等于纸的最小边长,后手无法放置圆形片。接下来,无论后手怎么放纸片,先手总可以对称地放置一个与后手放置的圆形片相对应的圆形片,保持对称,并且不会相交,直到纸的所有空间都被填满。因此,先手必胜。
根据上述分析,可以得出结论:如果满足条件2或者条件3,则先手必胜;否则,先手必输。
以下是相应的C++代码实现:#include <iostream>
#include <cmath>
using namespace std;
string whoWins(int a, int b, int r) {
int minSide = min(a, b);
double minDiameter = r * sqrt(2);
if (r >= minSide / 2)
return "Bob win";
else if (minDiameter > minSide)
return "Bob win";
else
return "Alice win";
}
int main() {
int a, b, r;
cin >> a >> b >> r;
string result = whoWins(a, b, r);
cout << result << endl;
return 0;
}
以上代码中,我们定义了一个whoWins函数来判断先手是否能赢得游戏。在main函数中,我们读取输入的a、b、r值,并调用whoWins函数进行判断,最后输出结果。
注意:在输入时,要确保纸的长度a和宽度b大于0,半径r大于等于0。考虑边界情况和非法输入超出范围的情况。 |