博弈论--矩形内画圆

上个月我在写acm的题时,碰到了这么一道题,直到昨天我才把它解出来。

题名:赢不了的谢强富

题目描述:

​ 某天,谢强富在慕课上看了两个人玩游戏,谢强富对这个游戏很感兴趣,所以他立马拉上了志强一起玩这个游戏。游戏规则如下:首先两个人在一张纸上画了一个长宽分别为A,B的严格的矩形,然后两人依次画半径为R的圆,两人画的圆可以相切但是绝对不允许相交,当其中某一个人无法画出圆的时候,他就输了。谢强富和志强都很聪明。谢强富要首先画圆,但是玩了很多次,谢强富发现自己输多赢少,他想请问你,什么时候他能赢。

Input

第一行输入n,代表有n组测试样例。

每一组测试样例输入矩形的长:A,宽:B,和圆的半径:R。

Output

对于每一组测试样例,如果谢强富能赢输出YES,否则输出NO。

Sample Input 1

2
4 5 6
5 5 2

Sample Output 1

NO
YES

解题思路:

​ 其实我刚开始拿到这道题时我也很懵,似乎对于每一个案例的解法都是不一样的,而圆的最优位置也无从得知,反正就是想方设法让对手画不下去。
​ 但片刻思考过后我们都应知道,第一个圆一定是画在矩形的正中心,这样其他空间的最大空白处就是除圆以外的矩形的四个角,而四个角能不能画下另一个圆似乎就要再次计算了,而且计算过程好像还挺复杂的,如果能画下,那别的三个角都能画下了,然后继续计算,角上的圆之间似乎又会产生空隙,我们继续计算最大的空隙是否能再画圆,而且这次的计算过程似乎还和上次不一样,也更复杂了。
这样就导致我们对于解题的整体思路不够清晰,写不出来代码。
​ 上述方法其实是个误区,我们应该这样想,假如A先画,如果能画下去,那么会有四个空位,四个空位如果不能继续画下去,那A就赢了,如果能画下去,那么画的顺序将是B,A,B,A,意思就是如果B能画,那么A也能画,然后还是B画,B又要在剩下的空间里画,如果B能画,由于空间是对称的,所以会有2N的空位画,这样A还是最后画,如此循环,发现最后B肯定会有画不下去的时候。
​ 所以我们得出结论只要先手的人能画下第一个圆,那么他就已经赢了。

源码:

#include<iostream>
using namespace std;
int main(){
    int n,a,b,r;
    cin>>n;
    while(n--){
        cin>>a>>b>>r;
        if(2*r<=a&&2*r<=b){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}

心得:

莽做题,莽计算是会浪费很多时间的,找到规律,问题就迎刃而解了!

行政

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 舒窈
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信