我比较菜,赛时没写出来,但赛后,看了一些代码,人工列举了很多棋谱,发现了很多规律

做法开个数组统计行列的X棋子数量,同行行列有O让数量为负,代表无法连成三个

  1. 很显然,如果只下了1或者2步棋,必胜

  2. 如果只下了3步棋,那么输的情况只有类似于

  • 空了一行或一列,且其他行如一下排列的棋局 (样例给的不错

    OXX , OXO

    XOO , XOX

    GGG , GGG

只要确保某行某列某斜线棋子数量一定是2就行

  • 如果空的是斜线,那么分为两种情况

    • X在另一个斜线上,且周边没有X,不赢

      GOX

      XGO

      OXG

    • X在另一个斜线上,周边有X,必赢 还是一个道理只要确保某行某列某斜线棋子数量大于1就行

  • 那么再考虑,空的不连续的情况,只需要验证,某一行还是某一列,还是某个斜线有一个X就可以了,且没有O,即大于等于1

3.下了4步棋,只需要找到某行某列某斜线数量为2就行

所以只需要找棋子数量>0就行

这样屑的话应该会比较短,有错T我

#include<bits/stdc++.h>

using namespace std;
#define ll long long
int t;
map<int,int> mp[5];
void solve(){
    int cnt=0;
    mp[1].clear();mp[2].clear();
    for(int i=1;i<=3;++i)
        for(int j=1;j<=3;++j){
            char p;cin>>p;
            if(p=='G') continue;
            ++cnt;
            mp[1][i]+=(p=='X')?1:-5;
            mp[2][j]+=(p=='X')?1:-5;
            if(i+j==4)mp[1][i+j]+=(p=='X')?1:-5;
            if(i-j==0)mp[1][i-j]+=(p=='X')?1:-5;
        }
    bool book=0;
    int res=0;cnt/=2;
    for(int i=1;i<=3;++i)
        for(auto [x,y]:mp[i])
             if(y>0) book=1;
    if(cnt<=2) puts("Yes");
    else {
        if(book)puts("Yes");
        else puts("No");
    }
}
int main(){
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

这题你说是思维吧也是

但是你说不是嘛,也可以打表列出所有情况找规律

实在不行,人工列表,情况就这么点