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