因为XXX不是每次都下“x”。。。。这是我狂wa30多次的原因。。悲剧
对于XXX走,如果存在一个子局面true,返回true,否则返回false
对于XXX的女友走,必须满足任意子局面true,返回true,否则返回false
感谢dut200901102神犇~
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a) for( int i = (a)-1 ; i >= 0 ; i --)
#define S64(a) scanf(in64,&a)
#define SS(a) scanf("%d",&a)
#define LL(a) ((a)<<1)
#define RR(a) (((a)<<1)+1)
#define pb push_back
#define CL(Q) while(!Q.empty())Q.pop()
#define MM(name,what) memset(name,what,sizeof(name))
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
const int inf = 0x3f3f3f3f;
const double oo = 10e9;
const double eps = 1e-10;
const double pi = acos(-1.0);
char a[6][6];
string s;
int sx,sy; //棋盘上‘x’和‘o’的数量
int num(int x,int y) // 给棋盘的每个点编号,1~16
{
return (x-1)*4+y;
}
bool you(int x,int temp) //看 x 的二进制形式的第 temp 位是否为 1
{
return (x&(1<<temp));
}
bool win(int x) // 判断局面是否已经赢了
{
int temp;
bool ok;
for(int u=1;u<=4;u++)
{
ok = true;
for(int k=1;k<=4;k++)
{
temp = num(u,k);
if(!you(x,temp))
{
ok = false;
break;
}
}
if(ok) return true;
}
for(int k=1;k<=4;k++)
{
ok = true;
for(int u=1;u<=4;u++)
{
temp = num(u,k);
if(!you(x,temp))
{
ok = false;
break;
}
}
if(ok) return true;
}
ok = true;
for(int u=1;u<=4;u++)
{
temp = num(u,u);
if(!you(x,temp))
{
ok = false;
break;
}
}
if(ok) return true;
ok = true;
for(int u=1;u<=4;u++)
{
temp = num(5-u,u);
if(!you(x,temp))
{
ok = false;
break;
}
}
if(ok) return true;
return false;
}
bool dfwin(int step,int x,int y,bool wh) //判断XXX是否能赢
{
if(win(x)) return true;
if(win(y)) return false;
if(step == 17) return false;
if(wh)
{
for(int u=1;u<=16;u++)
{
if(!you(x,u) && !you(y,u))
{
if(dfwin(step+1,x+(1<<u),y,false))
{
return true;
}
}
}
return false;
}
else
{
for(int u=1;u<=16;u++)
{
if(!you(x,u) && !you(y,u))
{
if(!dfwin(step+1,x,y+(1<<u),true))
{
return false;
}
}
}
return true;
}
}
bool dflose(int step,int x,int y,bool wh) //判断XXX是否能输
{
if(win(x)) return false;
if(win(y)) return true;
if(step == 17) return false;
if(wh)
{
for(int u=1;u<=16;u++)
{
if(!you(x,u) && !you(y,u))
{
if(dflose(step+1,x+(1<<u),y,false))
{
return true;
}
}
}
return false;
}
else
{
for(int u=1;u<=16;u++)
{
if(!you(x,u)&&!you(y,u))
{
if(!dflose(step+1,x,y+(1<<u),true))
{
return false;
}
}
}
return true;
}
}
bool pin(int step,int x,int y,bool wh) //判断XXX是否能平
{
if(win(x) || win(y)) return false;
if(step == 17) return true;
if(wh)
{
for(int u=1;u<=16;u++)
{
if(!you(x,u) && !you(y,u))
{
if(pin(step+1,x+(1<<u),y,false))
{
return true;
}
}
}
return false;
}
else
{
for(int u=1;u<=16;u++)
{
if(!you(x,u) && !you(y,u))
{
if(!pin(step+1,x,y+(1<<u),true))
{
return false;
}
}
}
return true;
}
}
bool start()
{
int temp;
int x,y;
x = 0;
y = 0;
if(sx == sy)
{
for(int u=1;u<=4;u++)
{
for(int k=1;k<=4;k++)
{
if(a[u][k]=='x')
{
temp = num(u,k);
x |= 1<<temp;
}
else if(a[u][k] == 'o')
{
temp = num(u,k);
y |= 1<<temp;
}
}
}
}
else
{
for(int u=1;u<=4;u++)
{
for(int k=1;k<=4;k++)
{
if(a[u][k]=='x')
{
temp = num(u,k);
y |= 1<<temp;
}
else if(a[u][k] == 'o')
{
temp = num(u,k);
x |= 1<<temp;
}
}
}
}
int step = sx+sy +1;
if(s=="LOSE")
{
return dflose(step,x,y,true);
}
else if(s=="WIN")
{
return dfwin(step,x,y,true);
}
else if(s=="TIE")
{
return pin(step,x,y,true);
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>s;
sx =0;
sy= 0;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>a[i][j];
if(a[i][j]=='x')
{
sx++;
}
else if(a[i][j]=='o')
{
sy++;
}
}
}
if(start())
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}