//============================================================================
// Name : 4049.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <stdio.h>
using namespace std;
#define N 4
typedef enum result {
WIN, TIE, LOSE, UNKNOWN
} Result;
int x[N][N];
Result want;
int empty;
int xxx;
void outX() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d", x[i][j]);
}
puts("");
}
puts("");
}
Result getResult() {
int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < N; i++) {
sum1 += x[i][i];
sum2 += x[i][N - 1 - i];
int sum3 = 0;
int sum4 = 0;
for (int j = 0; j < N; j++) {
sum3 += x[i][j];
sum4 += x[j][i];
}
if ((sum3 & 4) || (sum4 & 4)) {
if (xxx)
return WIN;
else
return LOSE;
}
if ((sum3 & 32) || (sum4 & 32)) {
if (xxx)
return LOSE;
else
return WIN;
}
}
if ((sum1 & 4) || (sum2 & 4)) {
if (xxx)
return WIN;
else
return LOSE;
}
if ((sum1 & 32) || (sum2 & 32)) {
if (xxx)
return LOSE;
else
return WIN;
}
if (empty == 0) {
return TIE;
} else {
return UNKNOWN;
}
}
bool succeed(bool self) {
if (self) {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (x[i][j] == 0) {
if (xxx)
x[i][j] = 1;
else
x[i][j] = 8;
empty--;
Result rs = getResult();
if (rs == want) {
x[i][j] = 0;
empty++;
return true;
} else if (rs == UNKNOWN) {
if (succeed(false)) {
x[i][j] = 0;
empty++;
return true;
} else {
x[i][j] = 0;
empty++;
}
} else {
x[i][j] = 0;
empty++;
}
}
}
return false;
} else {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (x[i][j] == 0) {
if (xxx)
x[i][j] = 8;
else
x[i][j]=1;
empty--;
Result rs = getResult();
if (rs == UNKNOWN) {
if (!succeed(true)) {
x[i][j] = 0;
empty++;
return false;
} else {
x[i][j] = 0;
empty++;
}
} else if (rs != want) {
x[i][j] = 0;
empty++;
return false;
} else {
x[i][j] = 0;
empty++;
}
}
}
return true;
}
}
int main() {
int t;
scanf("%d", &t);
char str[5];
while (t--) {
scanf("%s", str);
switch (str[0]) {
case 'L':
want = LOSE;
break;
case 'W':
want = WIN;
break;
case 'T':
want = TIE;
break;
}
empty = 0;
xxx = 1;
for (int i = 0; i < N; i++) {
scanf("%s", str);
for (int j = 0; j < N; j++) {
switch (str[j]) {
case '.':
x[i][j] = 0;
empty++;
break;
case 'x':
x[i][j] = 1;
xxx--;
break;
case 'o':
x[i][j] = 8;
xxx++;
break;
}
}
}
bool su = succeed(true);
if (su)
puts("YES");
else
puts("NO");
}
return 0;
}
poj4049
最新推荐文章于 2017-02-07 12:54:30 发布