极大极小博弈
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
char goal[10];
char str[4][4];
bool check(int sta){
int tmp[4][4];
int i,j;
memset(tmp,0,sizeof(tmp));
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(sta&(1<<(i*4+j)))
tmp[i][j]=1;
bool flag=0;
for(i=0;i<4;i++){
bool ok=1;
for(j=0;j<4;j++)
if(tmp[i][j]==0){
ok=0;
break;
}
if(ok){
flag=1;
break;
}
}
if(flag)return 1;
for(j=0;j<4;j++){
bool ok=1;
for(i=0;i<4;i++)
if(tmp[i][j]==0){
ok=0;
break;
}
if(ok){
flag=1;
break;
}
}
if(flag)return 1;
for(i=0;i<4;i++)
if(tmp[i][i]==0)break;
if(i==4)flag=1;
if(flag)return 1;
for(j=0,i=3;i>=0;i--,j++)
if(tmp[i][j]==0)break;
if(j==4)flag=1;
return flag;
}
bool isWin(int step,int sx,int sy,bool turn){
if(check(sx))return 1;
if(check(sy))return 0;
//if((sx|sy)==((1<<16)-1))return 0;
if(step==17)return 0;
if(turn){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isWin(step+1,sx|(1<<(i*4+j)),sy,!turn))return 1;
}
return 0;
}
else{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isWin(step+1,sx,sy|(1<<(i*4+j)),!turn)==0)return 0;
}
return 1;
}
}
bool isLose(int step,int sx,int sy,bool turn){
if(check(sx))return 0;
if(check(sy))return 1;
//if((sx|sy)==((1<<16)-1))return 0;
if(step==17)return 0;
if(turn){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isLose(step+1,sx|(1<<(i*4+j)),sy,!turn))return 1;
}
return 0;
}
else{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isLose(step+1,sx,sy|(1<<(i*4+j)),!turn)==0)return 0;
}
return 1;
}
}
bool isTie(int step,int sx,int sy,bool turn){
if(check(sx))return 0;
if(check(sy))return 0;
//if((sx|sy)==((1<<16)-1))return 1;
if(step==17)return 1;
if(turn){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isTie(step+1,sx|(1<<(i*4+j)),sy,!turn))return 1;
}
return 0;
}
else{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(sx&(1<<(i*4+j)))continue;
if(sy&(1<<(i*4+j)))continue;
if(isTie(step+1,sx,sy|(1<<(i*4+j)),!turn)==0)return 0;
}
return 1;
}
}
bool solve(){
int x,y,i,j,sx,sy;
bool turn=1,ans=0;
x=y=0,sx=sy=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(str[i][j]=='x'){
x++;
sx|=(1<<(i*4+j));
}
else if(str[i][j]=='o'){
y++;
sy|=(1<<(i*4+j));
}
if(x>y) swap(sx,sy);
int step=x+y+1;
if(strcmp(goal,"WIN")==0){
ans=isWin(step,sx,sy,turn);
}
else if(strcmp(goal,"LOSE")==0){
ans=isLose(step,sx,sy,turn);
}
else{
ans=isTie(step,sx,sy,turn);
}
return ans;
}
int main(){
int t,T;
scanf("%d",&T);
for(t=1;t<=T;t++){
scanf("%s",goal);
for(int i=0;i<4;i++)
scanf("%s",str[i]);
if(solve()) puts("YES");
else puts("NO");
}
}