博弈打表

题目描述
牛牛感觉在上一次赌约中,情况对于自己非常不利,所以决定再赌一场。
这时候,牛蜓队长出现了:第一,绝对不意气用事;第二,绝对不漏判任何一件坏事;第三,绝对裁判的公正漂亮。
牛蜓队长带他们来到了一个棋盘游戏,棋盘左上角是(0,0)(0,0),这个棋盘在(x,y)(x,y)的位置有一个棋子,牛牛和牛可乐轮流移动这个棋子,这个棋子可以左移也可以上移,可以移动一格或者两格,直到不能再移动(即到(0,0)(0,0))的那个人算输。
如果原本在(x,y)(x,y),左移一格即为(x,y -1)(x,y−1),上移一格即为(x-1,y)(x−1,y)
这个时候,牛牛为了弥补上一局的不公平,决定要自己先手,如果两个人都用最优的策略,最后牛牛是否能获胜。

PS:不知道是不是接触的少的原因还是我很弱,总之博弈的题目总是做不出来,并且不知道往哪方面思考,这个题目也是一样,起初都不知道题目是什么意思,但是好在最后看懂题目了,博弈的题目一般都是不难的,至少目前我遇到的都是简单的博弈,也就是判断几个状态,正当我看题解看的迷糊的时候,突然看到了一个耳目一新的题解,因为大佬的题解总是简单至极(大道至简嘛),所以有时候理解大佬的代码很费劲,不过还好这个世界大佬在少数,hhh~

题目分析:题目说,要判断牛牛是否能获胜,那么我们可以根据几个点的状态来推导其他点的状态,首先,因为牛牛先手,那么0,0这个点的状态肯定是输的,另外根据移动的条件,(1,0),(2,0),(0,1),(0,2)则是赢的,我们接下来只需要看一下当前所在的位置是否能走到能让对手失败的位置即可。这样一个表的状态就可以求出来了,根据表的情况,我们可以判断当x==y以及(x-y)的绝对值是3的倍数的时候都是注定失败的点,那么题目就知道了

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int x, y;
        cin >> x >> y;
        ll t = abs(x - y);
        if (1 == t % 3 || 2 == t % 3)
            cout << "yyds" << endl;
        else
            cout << "awsl" << endl;
    }
    return 0;
}