这题一开始在用极大极小搜索,一只WA,最后才发现女孩不是走的最优,而是乱走的,知道这一点之后的搜索就好理解了。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/28.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
vector<pair<int,int> > can;
char str[5][5];
int vis[5][5];
const int boy=0,girl=1;
char boychess,girlchess;
string result;
bool check(int ch)
{
int tot;
for(int i=0;i<4;i++){
tot=0;
for(int j=0;j<4;j++){
if(str[i][j]==ch) tot++;
}
if(tot==4) return true;
}
for(int i=0;i<4;i++){
tot=0;
for(int j=0;j<4;j++){
if(str[j][i]==ch) tot++;
}
if(tot==4) return true;
}
tot=0;
for(int i=0;i<4;i++){
if(str[i][i]==ch) tot++;
}
if(tot==4) return true;
tot=0;
for(int i=0;i<4;i++){
if(str[i][3-i]==ch) tot++;
}
if(tot==4) return true;
return false;
}
bool dfs(int who)
{
if(who==boy){
if(check(girlchess))
return result=="LOSE";
}
else{
if(check(boychess))
return result=="WIN";
}
int sum=0,satisfy=0;
for(int i=0;i<can.size();i++)
{
int x=can[i].first;
int y=can[i].second;
if(!vis[x][y])
{
sum++;
vis[x][y]=1;
if(who==boy)
str[x][y]=boychess;
else
str[x][y]=girlchess;
if(dfs(!who))
satisfy++;
vis[x][y]=0;
str[x][y]='.';
if(who==boy&&satisfy>0)
return 1;
if(who==girl&&satisfy<sum)
return 0;
}
}
if(sum==0) return result=="TIE";
if(who==boy) return satisfy>0;
else return satisfy==sum;
}
void solve()
{
memset(vis,0,sizeof(vis));
int cx=0,co=0;
can.clear();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(str[i][j]=='x') {vis[i][j]=1;cx++;}
if(str[i][j]=='o') {vis[i][j]=1;co++;}
if(str[i][j]=='.') {can.push_back(make_pair(i,j));}
}
}
if(cx==co)
boychess='x',girlchess='o';
else
boychess='o',girlchess='x';
if(dfs(boy))
printf("YES\n");
else
printf("NO\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
cin>>result;
for(int i=0;i<4;i++)
scanf("%s",str[i]);
solve();
}
return 0;
}