题解

new_user_4 2023-09-25 0:03:04 2023-09-25 12:30:43

由题目可知,我们仅需要对白棋操作一次然后对整个棋局进行判断即可,但是有可能黑棋一开始就获胜了,所以我们需要对特殊情况进行特判

#include <bits/stdc++.h>
#define endl '\n'


using namespace std;

int n, m;

char mp[4][4];

int dx[8] = { 0, 0, 1, -1,  1, 1,  -1, -1 };
int dy[8] = { 1,-1, 0,  0, -1, 1,   1,  -1 };

vector<pair<int, int>> g, f;
vector<int> x, y;
//通过叉积or斜率对三点一线进行判断
int check() { return (x[1] - x[0]) * (y[2] - y[0]) - (y[1] - y[0]) * (x[2] - x[0]) == 0; }

void solve() {
    x.clear(), y.clear(), g.clear(), f.clear();
    for(int i = 1;i <= 3;i ++) 
        for(int j = 1;j <= 3;j ++) 
    {
        cin >> mp[i][j];
        if (mp[i][j] == 'W')//将两种棋子坐标读入
            g.push_back({ i, j });
        else if (mp[i][j] == 'B')
            f.push_back({ i, j });
    }
//对黑棋进行特判
    for (auto p : f) {
        x.push_back(p.first);
        y.push_back(p.second);
    }

    if (check()) {
        cout << "Lose" << endl;
        return;
    }
    
    x.clear(), y.clear();

    for (auto p : g) {
        x.push_back(p.first);
        y.push_back(p.second);
    }
    //对白棋进行模拟,注意回溯
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 8; j++) 
        {
            int x1 = x[i], y1 = y[i];
            if((x1==1&&y1==2||x1==2&&y1==1||x1==2&&y1==3||x1==3&&y1==2)&& j>=4) break;
            x[i] = x1 + dx[j], y[i] = y1 + dy[j];

            if (x[i] <= 3 && y[i] <= 3 && x[i] >= 1 && y[i] >= 1 && mp[x[i]][y[i]] == '.') 
            {
                if (check()) 
                {
                    cout << "Win!" << endl;
                    return;
                }
            }

            x[i] = x1, y[i] = y1;
        }
    }
    //如果还能到这一步那就是平局
    cout << "Draw" << endl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) {
        solve();
    }

    return 0;
}