PMOI T3 游戏 sol

· · 题解

upd:由于洛谷出了哔哩哔哩嵌套功能,所以在这里加了一份视频题解(之前只有链接)。

官方题解

看起来没啥思路,正难则反。

考虑黑棋要怎么卡白棋。

有一个简单的方法:隔两个一堵。

比如,黑白时,你应该和第一个黑空两个格子,就是黑白空黑

如果白棋竖着连就竖着这样堵,斜着连就斜着堵。这样一来,白棋永远赢不了。

那么白棋想赢,就要自己占上隔着两个的位置,不让黑棋下。

这时候黑棋很被动,能走的很有限。

接下来考虑必胜策略。

首先,黑空白白1 步必胜的,我们叫它必胜 1。所以,两个黑空白同时出现就是 2 步必胜的,我们叫它必胜 2

容易发现,走完第一步之后,如果黑棋不走它两边的地方,那么白棋下一步即可达到必胜 1

如果走了,就下在 (2,2)。这时,它与 (0,0)(2,0)(4,0) (即白棋第一步的两边)都组成了一个黑空白。然后就达成了一个必胜 2。所以,最多 4 步即可胜利。

不明白的话可以看视频题解 https://www.bilibili.com/video/bv1jr4y1N7iA

std:

#include<iostream>
using namespace std;
int x,y;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cout<<"3 0"<<endl;
        cin>>x>>y;
        if(x==2&&y==0)
        {
            cout<<"2 2"<<endl;
            cin>>x>>y;
            if(x==2)
            {
                cout<<"3 3"<<endl;
                cin>>x>>y;
                if(x==1&&y==1)
                cout<<"4 4"<<endl;
                else cout<<"1 1"<<endl;
            }
            else
            {
                cout<<"2 3"<<endl;
                cin>>x>>y;
                if(x==2&&y==1)
                cout<<"2 4"<<endl;
                else cout<<"2 1"<<endl;
            }
        }
        else if(x==4&&y==0)
        {
            cout<<"2 2"<<endl;
            cin>>x>>y;
            if(x+y==4)
            {
                cout<<"3 3"<<endl;
                cin>>x>>y;
                if(x==1&&y==1) cout<<"4 4"<<endl;
                else cout<<"1 1"<<endl;
            }
            else
            {
                cout<<"1 3"<<endl;
                cin>>x>>y;
                if(x==3&&y==1) cout<<"0 4"<<endl;
                else cout<<"3 1"<<endl;
            }
        }
        else if(x==1&&y==0)
        {
            cout<<"4 0"<<endl;
            cin>>x>>y;
            if(x==2&&y==0) cout<<"5 0"<<endl;
            else cout<<"2 0"<<endl;
        }
        else
        {
            cout<<"2 0"<<endl;
            cin>>x>>y;
            if(x==1&&y==0) cout<<"4 0"<<endl;
            else cout<<"1 0"<<endl;
        }
    }
    return 0;
}